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个参数列表的方法等同于相应的函数,这个函数包含一个在首次插入方法对象时创建的列表。
如果你仍然不明白方法如何工作,看看它的实现可能就会明白真相。 当一个实例属性引用一个不是数据属性时,它的类是可搜索的。如果这个名称表示一个合法函数对象属性,通过把在抽象类中发现的(指针)实例对象和函数对象封装一起进而创建了方法对象。当方法对象用一个列表参数调用时,一个新的参数列表将会从实例对象和参数列表中创建,并且函数对象用新的属性列表调用。