Python对象方法

under python

in tech

Published: 2016-10-19

对象方法可以看成将一个对象和一个函数包装后形成的可调用的新对象。调用对象所产生的效果就是将被绑定的对象添加到参数列表最前面,然后用该新的参数列表调用被绑定的函数。例如如果m是对象o和函数f绑定的结果,则m(x, y) = f(o, x, y)

Python规定,对象的某属性如果要成为方法,需要满足两个条件:

先解释对象属性和类属性的关系,如果有一个简单的类,并用它生成一个对象:

class A(object):
    class_data = 0

    def __init__(self):
        self.x = 1

    def show(self):
        print(self.x)

a = A()

x是对象a的属性,但showclass_data不是,但仍可以用a.showa.class_data来访问它,因为在对象的属性列表里找不到某属性的时候,Python会按一定的顺序搜索其类和基类的同名属性,返回找到的第一个结果或最终甩出AttributeError异常。这里a.x就是对象属性,而A.showA.class_data就是类属性。

a.show是类属性还是对象属性,虽然它最终指向了A.show,但使用起来不一样。调用a.show不需要提供任何参数,因为它绑定了a作为show的第一个参数,即使用别的名称访问它也一样:

>>> a.show()
1
>>> f = a.show()
>>> f()
1

调用A.show的时候必须提供第一个对象参数:

>>> A.show()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: show() missing 1 required positional argument: 'self'
>>> A.show(a)
1

因此这里必须作一个概念上的区分,按照Python 3的术语,类属性A.show是函数,而对象属性a.show则是方法,Python 2概念更复杂,但最终表现一样,因此不妨按照Python 3的概念来理解它。如果类属性不是函数,则通过对象访问它还是通过类访问它没有区别。

可以为已定义的类添加方法:

>>> A.double = lambda self: self.x * 2
>>> a.double()
2

但必须添加为类属性,直接添加到对象属性不会成为方法:

>>> a.triple = lambda self: self.x * 3
>>> a.triple()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: <lambda>() missing 1 required positional argument: 'self'
>>> a.triple(a)
3

(完)