函数是Python中的可调用对象,即可以使用调用运算符调用(尽管其他对象可以通过实现__call__来模拟函数).例如:
>>> def a(): pass
>>> a
>>> type(a)
方法是一种特殊的函数类,可以绑定或不绑定.
>>> class A:
... def a(self): pass
>>> A.a
>>> type(A.a)
>>> A().a
>
>>> type(A().a)
当然,无法调用未绑定的方法(至少不能直接将实例作为参数传递):
>>> A.a()
Traceback (most recent call last):
File "", line 1, in
TypeError: unbound method a() must be called with A instance as first argument (got nothing instead)
在Python中,在大多数情况下,您将不会注意到绑定方法,函数或可调用对象(即实现__call__的对象)或类构造函数之间的区别.它们看起来都一样,只是有不同的命名约定.在引擎盖下,物体看起来可能大不相同.
这意味着绑定方法可以用作函数,这是使Python如此强大的许多小事之一
>>> b = A().a
>>> b()
这也意味着即使len(…)和str(…)(后者是一个类型构造函数)之间存在根本区别,在深入挖掘之前,你不会注意到差异:
>>> len
>>> str