python语言用什么关键字来声明一个类_Python语言和标准库(第三章:类和对象)...

python如何将函数和数据整合在一起,并且通过一个对象的名称访问它们。

如何和为什么使用类与对象,以及他们如何使编程人员易于多种情形下编写和使用程序。

3.1考虑编程

现在要在python中创建一个对对象的描述,您已有足够的只是获得两个视图。第一个是数据视图,除了顶层或者全局作用域的数据外,可以根据需要使用和清除它们。另一个函数视图,他们没有固有的数据,而是操作提供给他们的数据。

3.1.1对象的含义

任何一个数据都有对象,每个对象都由3部分组成:标识,类型和值。对象的标识代表该对象在内存中存储的位置(不可改变的),对象的类型表明它可以拥有数据和值的类型,在对象中,可变类型的值可以更改,不可变类型的值不能更改。

简单些的解释是参考本书中已经介绍的对象。例如,整型,字符串,列表等都是对象。可以在程序中很方便地使用这些对象,但是将关系紧密的对象整合在一起岂不是更有意义?这就是类的由来,类允许定义一组对象,并将他们封装到一个方便的空间去。

3.1.2已经了解的对象

3.1.3如何使用对象

3.2定义类

当思考包含几百行python代码的小程序如何运行时,经常可以发现程序将数据组织成组的形式——当访问某个数据时,将影响与该数据一起协作的数据。经常会碰到有依赖关系的完整数据列表,如列表1的第一个元素和列表2和列表3中的第一个元素匹配。有时,必须通过创造性地将这些列表组合起来才能解决这个问题。python运用了创建用作占位符的整个类的概念,类起了占位符的作用,当一个类被调用时,它创建了绑定到一个名称的对象。

3.2.1如何创建对象

定义一个类

使用关键字class,在后面紧跟一个名称来完成。

class Fridge:

由类创建对象

>>>f=Fridge()

此时还没有定义任何复杂的类,Fridge类基本是空的,它作为一个起点。然而,即使他是空的,也应当注意到已经创建了一个可用的空类,它几乎不进行任何操作。

161403332798136.png

花上几分钟看_init_和self部分,则是类的两个非常重要的特征,当python创建对象时,_init_方法传递给对象第一个参数。而self实际上是代表该实例本身的变量。

编写内部方法

161415014987890.png

这个内部方法,不能判断当前传入的类型是否有效,应当用接口函数去检测。在允许的每个地方做检查是一个好想法,但在当前这个例子中,不打算在此处检查,因为只会以非常简单的方式使用_add_multi方法。

编写接口方法

为了更快捷,现在可以不输入文档字符串,此处的方法使您在遇到问题时,可以更好地理解代码的实际操作。

这些方法需要缩进在Fridge类的定义中,看上去每行的初始位置开始的任何代码实际上是前一行的延续,应当输入到同一行上:

defadd_one(self, food_name):if type(food_name) != type(""):raise TypeError,"add_one requires a string,given a %s"%type

(food_name)else:

self._add_multi(food_name,1)returnTruedefadd_many(self, food_dict):if type(food_dict) !=type({}):raise TypeError("add_many requires a dictionary,got a %s"food_dict)for item infood_dict.keys():

self._add_multi(item, food_dict[item])return

add_one和add_many的目的是类似,并且每个方法都有可以确保他们被正确使用的代码,他们都可以使用add-multi来完成主要工作。现在,如果add-multi的工作方式分发生改变,开发人员可以节省时间,因为它将自动改变使用它的两个方法的行为方式。

现在已经编写了足够的代码,可以把食物放入Frige对象中,但是没有方法可以将放入冰箱的食物拿出来。可以直接访问object.items字典,但是除了测试的时候,这种不是一个好主意。但是现在就是测试,为何不这样做呢?

>>>f = Fridge({"eggs":6,"milk":4,"cheese":3})>>>f.items

{'cheese':3,'eggs':6,'milk':4}>>>f.add_one("grape")

True>>>f.items

{'cheese':3,'eggs':6,'grape':1,'milk':4}>>>f.add_many({"mushroom":5,"tomato":3})>>>f.items

{"tomato":3,'cheese':3,'grape':1,'mushroom':5,'eggs':6,'milk':4}

目前为止输入的代码都能正常工作了,接下来需要增加可以判断冰箱中是否存在某物的方法。

编写代码真是某物是否在冰箱中存在很重要,因为它可以用于取出食物的方法中,如get_one,get_many,get_ingredients,从而使这些方法可以检查冰箱中是否有足够多所需的食物,这正是has和has_various方法的用途。

def has(self,food_name,quantity=1):returnself.has_various({food_name:quantity})defhas_various({self,foods):try:for food infoods.keys():if self.items[food]

使用更多的方法:

现在可以使用python-i或者Run with Interpreter命令调用ch6.py文件,这样可以使用调价到Fridge类的任何代码。如果出现错误而不是>>>提示符,注意抛出的异常,并试图修复缩进问题,拼写错误或者其他基本错误。

Fridge类可按下述方法使用:

>>>f = Fridge({"eggs":6,"mike":4,"cheese":3})>>>if f.has("cheese",2):

...print("its time to make an omelet")

...

its time to make an omelet

实例说明:现在已经定义了新的方法,f对象可以使用它们,当用鸡蛋牛奶以及奶酪重新创建f对象时,就从新的fridge类创建对象,因此它拥有新添加的可用方法。

最后,我们应当讨论从冰箱中取食物的方法了。与向冰箱中添加食物的方法类似,由一个核心方法完成主要工作,所有接口方法都是依赖于这个方法。

def_get_multi(self,food_name,quantity):try:if(self.items[food_name] isNone):returnFalse;if(quantity>self.items[food_name]):returnFalse;

self.items[food_name]= self.items[food_name]-quantityexceptKeyError:returnFalsereturn quantity

定义后,可以创建文档字符串指定的方法,其中每个方法都是使用_get_multi,因此都可以最少的额外代码从冰箱中取出食物:

211417533718192.png

211418311991936.png

3.2.2对象和它们的作用域

函数为他们使用的名称创建了自己的空间,也就是作用域。当函数被调用时,声明了名称并赋予值之后,只要函数还在使用,任何对该名称做出的修改会持续下去。然而,在函数结束运行后,并在此被调用,之前电泳过程中所做的工作都丢失了,改函数必须重新开始执行。

对象中的值可被存储的,并关联在self中,就是说self是指向对象的。

创建另外一个类:

我们创建了一个fridge类,现在创建omelet类:

211443172467073.png

211443460439609.png

现在有一个类,它目的很明确。omelet类有接口方法,使得它可与fridge对象协作,它仍具备创建指定煎蛋卷的功能。

下面代码都必须在omelet类定义下缩进一个级别:

def_ingredients_(self):returnself.needed_ingredientsdefget_kind(self):returnself.kinddefset_kind(self,kind):

possible_ingredients=self._known_kinds(kind)if possible_ingredients ==False:returnFalseelse:

self.kind=kind

self.needed_ingredients=possible_ingredientsdefset_new_kind(self,name,ingredients):

self.kind=name

self.needed_ingredients=ingredientsreturn

def_known_kind(self,kind):if kind == "cheese":return {"eggs":2,"mike":1,"cheese":1}elif kind == "mushroom":return {"eggs":2,"mike":1,"cheese":1,"mushroom":2}elif kind == "onion":return {"eggs":2,"mike":1,"cheese":1,"onion":1}else:

self.kind=kind

self.needed_ingredients=ingredientsreturn

defget_kown_kinds(self,fridge):

self.from_fridge=fridge.get_ingredients(self)defmix(self):for ingredient inself.from_fridge.keys():print("Mixing %d %s for the %s omelet"%self.from_fridge[ingredient],ingredient,self.kind)

self.mixed=truedefmake(self):if self.mixed ==true:print("cooking the %s omelet!"%self.kind)

self.cooked=true

现在有一个omelet类可以创建omelet对象,omelet类与煎蛋卷的过程有相同的特性。并且Omelet的外在表现集中到几个简单的接口

现在有两个类,用python -i或者run with Interpreter命令加载他们后,可制作一个煎蛋卷:

211526266376032.png

我们还可以制作多个煎蛋卷:

211529254802728.png

211529514337265.png

这样的编程方式,我们称之为面向对象,为什么会用于编制大型系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql主从1594错误_3分钟解决MySQL主从1594错误

3分钟解决MySQL主从1594错误简介Part1:写在最前1594这个错误看起来挺严重的,会提示你binlog文件或者Relay log损坏了,例如binary log is corrupted、relay log is corrupted之类的看起来很吓人是吧,多数是由于掉电引发的,这也说明了机房配备U…

ci框架 mysql 超时时间_mysql 字符集和校验规则( CHARSET amp; COLLATE)

我们首先看下常见建表语句:mallAllGoodsCREATE TABLE qywl.mallAllGoods ( id varchar(64) NOT NULL COMMENT 主键id,userId varchar(64) NOT NULL DEFAULT COMMENT 发布人id,storeId varchar(64) NOT NULL DEFAULT COMMENT 发布商号id,data varchar(1000) NOT NU…

SQL 附加数据库时出现 无法打开物理文件错误

错误信息: 执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo) ------------------------------ 无法打开物理文件 "D:\SqlDataBase\Test.mdf"。操作系统错误 5:"5(拒绝访问。)"。 (Microsoft SQL Server,错误…

Flash网页游戏辅助工具制作简析

《热血三国》好像是比较热,玩的人也挺多的,年前一个朋友希望能让我写一个这个游戏的外挂,也出于无聊,所以去玩了一下,谁知道一玩就有点喜欢这个游戏了,当然玩归玩,东西还是要做地,当…

sqlserver2008导出mysql_SQLserver 2008将数据导出到Sql脚本文件的方法

请看下面的操作图解。1.使用Sql Server Management Studio 2008 连接数据库。2.选中要导出数据的数据库节点,点鼠标右键,在菜单中选择“任务”->“生成脚本”,如图:3。在弹出的界面中,点2次“下一步”进入如图界面中…

opencv配置_Opencv在vs2012下的配置

别问我为什么记录这么老的版本,问就是因为老师推荐和因为怕自己再次把小米的搜索框给忘记了,又找个好几十分钟的【环境变量】。另外,要敲敲自己的脑袋,作为小米电脑的老用户怎么可以把搜索框给忘记了呢?第一步&#xf…

php7安装mysqli扩展_Ubuntu14版本下无法使用php7.2版本的bcmath扩展

在使用如下命令安装bcmath扩展的时候sudo apt-add-repository ppa:ondrej/phpsudo apt-get updatesudo apt-get install php7.2-bcmath提示如下信息Reading package lists... DoneBuilding dependency tree Reading state information... DoneE: Unable to locate packag…

input 0.1无法相加_你真的知道0.1+0.2为何不等于0.3吗?

打开chrome控制台,给一个特别简单的输入如下:0.1 0.2 // 0.30000000000000004 复制代码不知道你有没有吃惊,这么简单的一个计算,无论在js中还是在python中,都不是准确的0.3,这是为什么呢?缘起要…

python图像增强_Python图像的增强处理操作示例【基于ImageEnhance类】

本文实例讲述了Python图像的增强处理操作。分享给大家供大家参考,具体如下: python中PIL模块中有一个叫做ImageEnhance的类,该类专门用于图像的增强处理,不仅可以增强(或减弱)图像的亮度、对比度、色度&…

python 二项分布_二项分布的理论基础、应用及Python实践

二项分布是概率统计中非常基础、非常实用的一种分布,可以说它在我们的生活中无所不在。它说明了这样一种现象:在给定的试验次数中,某一结果会发生多少次。比如:这个月有多少天会刮北风?今年有多少天会下雨?…

python网络爬虫_python小知识,基于Python 的网络爬虫技术分析

在现阶段大数据的时代中,想要实现对数据的获取和分析,要先具备足够的数据源,网络爬虫技术就为其数据获取提供了良好的条件,且还能够实现对数据源的目的性采集。在网络爬虫技术应用中,Python 脚本语言的使用十分广泛&am…

maven 整体打包_Spirng boot maven多模块打包不踩坑(示例代码)

本文参考 https://blog.csdn.net/Ser_Bad/article/details/78433340经过实战一次通过。回话不多说,话费不多说,直接上图。项目整体结构:父模块:xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocatio…

使用mysql制作学生成绩单_【实例讲解】快速制作学生成绩单

本文由网友潇之骥授权原创直发今天有位学校的老师找我给她作学生成绩单,给的数据如图1:(图1)需要的效果如下:(图2)讲解:要实现这种效果,只要用【邮件合并】这个功能就可以轻松搞定。要用好【邮件合并】这个功能&#x…

c语言 判断一个图是否全连通_基于云平台的全链路大规模网络连通性检测系统详解...

虚拟网络排查问题困难,传统的traceroute等工具很难起到太大作用,大部分情况下都需要到宿主机、混合云网关上抓包来troubleshooting,耗时又费力。有些场景中包的传送路径比较长(如跨域、混合云等),可能丢包的地方比较多&#xff0c…

java对接华为推送服务_华为HMS Core 4.0版本即将来袭:包含新推送服务

据官方消息,在12月27日的HUAWEI Developer Groups(简称HDG)大连活动上,华为消费者云服务HMS运营经理透露HMS Core 4.0版本即将上线,由原来的14项增加至24项核心开放功能,近日即将开放新版本众测,不久之后开发者们将会体…

python xml etree_python解析xml文件之xml.etree.cElementTree和xml.etree.ElementTree区别和基本使用...

1、解析速度:ElementTree在 Python 标准库中有两种实现。一种是纯 Python 实现例如 xml.etree.ElementTree ,另外一种是速度快一点的 xml.etree.cElementTree 。你要记住: 尽量使用 C 语言实现的那种,因为它速度更快,而…

CISSP的成长之路(二十一):用户持有凭证

在51CTO安全频道特别策划的CISSP的成长之路系列的上一篇文章《讲解身份验证过程》里,J0ker给大家介绍了用户验证时所依赖的三种验证要素、密码和密码短语及其安全使用原则。作为技术实施难度和成本最低的用户验证方案,基于密码的用户验证方案广泛应用于我们的日常生…

独家:Havok 发布新的 AI 中间件

独家:Havok 发布新的 AI 中间件 March 23rd, 2009 Alex J. Champandard 2009-3-23,赖勇浩(http://blog.csdn.net/lanphaday)译 原文地址:http://aigamedev.com/middleware/havok-ai-announced 在20日(上周五…

mysql查询入门_Mysql入门(四)查询

我们继续查询~条件查询及逻辑运算符条件查询如果我只想查询&#xff0c;年级小于30的&#xff0c;可以加个where条件关键字~条件查询敲黑板select * from yingxiong where y_age<30where 表示条件(条件关键字)&#xff0c;在where之后跟过滤的条件注意&#xff1a;逻辑运算符…

maven provided_Maven 教程之 pom.xml 详解

点击上方“Java知音”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;作者&#xff1a;dunwuhttps://github.com/dunwu/blog推荐阅读(点击即可跳转阅读)1. SpringBoot内容聚合2. 面试题内容聚合3. 设计模式内容聚合4. Mybatis内容聚合5. 多线程内容聚合简介什…