Python3.2官方文档翻译--实例对象和方法对象

6.3.3 实例对象

如今我们用实例对象做什么呢?实例对象唯一可用的操作就是属性引用。如今有两种合法的属性名称:数据属性和方法。

数据属性相当于smallTalk中的实例变量,C++中的数据成员。数据属性不须要申明。像局部连梁一样,当他们初次赋值的时候他们就存在了。比如,假设x是上面创建MyClass类的一个实例, 以下的代码块表示将会打印值16.这个值没有不论什么错误。

x.counter = 1

while x.counter < 10:

x.counter = x.counter*2

print(x.counter)

del x.counter

实例属性引用的还有一中方法是方法。方法是属于对于对象的函数。(在python中,术语方法和类实例不是唯一的):其它的对象类型也有方法。比如,list对象有称为append,insert,remove,sort方法等等。可是,在接下来的讨论中,除非特别说明,我们用术语方法来用对象实例的方法。)

一个实例对象的合法方法名称取决于它的类。依照定义,一个类中全部函数对象定义了相相应的实例方法。因此,在我们样例中,x.f是一个合法的方法引用,由于MyClass.f是一个方法,可是x.i不是,由于MyClass.i不是。可是x.f和MyClass.f不同,它时一个方法对象,而不是函数对象。

6.3.4 方法对象

通常来说,方法在绑定之后就会被调用。

X.f()

在MyClass实例中,它将会返回字符串’hello world’.可是,你无需立马调用方法:x.f是方法对象,能够暂被保存然后后来再调用,比如:

xf = x.f

while True:

print(xf())

将会不断打印hello world直到程序终止。

当方法调用时详细发生了什么?你可能已经注意到了,虽然函数定义f()时能够有个參数,但x.f()调用时候没有传參数。那參数发生了什么?当要求參数的函数没有不论什么參数而调用时,python一定会抛出异常。即使參数真正什么也没用。

其实,你能够推測答案: 方法有一个特性就是实例对象被当做第一个參数传递给了函数。在我们的样例中,x.f()方法等同于MyClass.f(x).一般来说,调用一个包括n个參数列表的方法等同于对应的函数,这个函数包括一个在首次插入方法对象时创建的列表。

假设你仍然不明确方法怎样工作,看看它的实现可能就会明确真相。 当一个实例属性引用一个不是数据属性时,它的类是可搜索的。假设这个名称表示一个合法函数对象属性,通过把在抽象类中发现的(指针)实例对象和函数对象封装一起进而创建了方法对象。当方法对象用一个列表參数调用时,一个新的參数列表将会从实例对象和參数列表中创建,而且函数对象用新的属性列表调用。

时间: 2024-10-07 10:07:17

Python3.2官方文档翻译--实例对象和方法对象的相关文章

Python3.2官方文档翻译---类一些说明

6.4 一些说明 数据属性可以重写同名的方法属性.这是为了避免在大型系统中产生问题的意外名称冲突.所以用一些减少冲突的常用方法是很有效果的.常用的方法包括:大写字母方法名称,用唯一的字符串来做为数据属性的名称(可以是个下划线_)或者用动词命名方法和用名字命名数据属性. 数据属性就像和对象的普通用户一样可以被方法引用.换句话说,类不能用来实现纯净的数据类型.事实上,在python中不能强制数据隐藏,一切基于约定.(另一方面,如C中写的,python的实现可以做到完全隐藏实现细节并且在必要是可以控制

Python3.2官方文档翻译--继承

6.5 继承 当然,一门语言特性如果不支持继承那么名称类就失去了价值.子类继承父类的方法如下: class DerivedClassName(BaseClassName): <statement-1> . . . <statement-N> 名称BaseClassName必须定义在一个包含派生类定义的作用域中.在基类名称的位置上,其他随意表达式都是允许的.例如,当基类定义在其他模块中,这也是可用的. class DerivedClassName(modname.BaseClassN

Python3.2官方文档翻译--类备注和异常也是类

6.7备注 有时有个像Pasca中"记录"和C中"数据体"的数据类型非常有用.集合一些数据项.一个空类定义可以清楚地显示: class Employee: pass john = Employee() # Create an empty employee record # Fill the fields of the record john.name = 'John Doe' john.dept = 'computer lab' john.salary = 1000

Python3.2官方文档翻译-标准库概览(二)

7.5 字符串模式匹配 re模块为高级字符串成处理提供了正则表达式匹配. 对于复杂的匹配和处理,正则表达式能够提供简明优化的方法: >>> import re >>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest') ['foot', 'fell', 'fastest'] >>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat'

Python3.2官方文档翻译--输出格式化

第八章 标准库二 第二部分涵盖了许多更能满足专业开发人员需求的高级模块.这些模块在小脚本中很少出现. 8.1 输出格式化 Reprlib模块为大型的或深度嵌套的容器缩写显示提供了repr()函数的一个定制版本. >>> import reprlib >>> reprlib.repr(set('supercalifragilisticexpialidocious')) "set(['a', 'c', 'd', 'e', 'f', 'g', ...])"

Python3.2官方文档翻译-多重继承和私有变量

6.5.1 多重继承 Python也支持多种继承形式.一个能继承多个基类的类定义如下: class DerivedClassName(Base1, Base2, Base3): <statement-1> . . . <statement-N> 大多数情况,最简单而言,你可以把从父类继承下来的属性查询看成是遵循深度优先,从左到右. 而不是在同一等级重复的同样类中执行两次.因此,如果一个属性没在派生类中找到,首先会在base1然后再base1的基类中,如果在那里都没发现,就会在bas

Python3.2官方文档翻译--生成器以及生成器表达式

6.10 生成器 生成器是一个创建迭代器的简单而有力的工具.它们书面写时就像规范的函数,但是用yield语句在任何时候都可以返回数据.每次在它上调用next()方法,生成器继续回到一起它离开的位置.(它记录所有数据值以及最后执行的语句).下面自己就是展示生成器如何方便创建: 用生成器可以做任何于底层迭代器相关的事情,正如前面章节中描述的.让生成器更加紧凑的办法就是自动创建的_iter_()和_next_()方法. 生成器其他重要的特性就是在调用过程中局部变量和执行状态可以自动的保存.这让函数更加

Python3.2官方文档翻译--标准库概览(一)

7.1 操作系统接口 Os模块提供主要许多与操作系统交互的函数. >>> import os >>> os.getcwd() # Return the current working directory 'C:\\Python31' >>> os.chdir('/server/accesslogs') # Change current working directory >>> os.system('mkdir today') # R

Python3.2官方文档翻译--模板

8.2 模板 String模块包含一个用途广泛的类,此类为最终用户的编辑提供了简单的语法支持.这让用户不修改应用程序的前提下实现他们应用程序的定制. 这种格式使用$加有效的python标识符(数字.字母和下划线)形式的占位符名称.通过在占位符两侧使用大括号便可以不用空格分隔在其后面跟随更多的字母和数字字符.使用$$来创建一个单独$转码字符. >>> from string import Template >>> t = Template('${village}folk