函数是Python中的可调用对象,即可以使用调用运算符进行调用。但是,其他对象也可以通过实现__call__方法来模拟功能。
def a(): pass # a() is an example of function print a print type(a)
输出结果
C:/Users/nhooo/~.py <function a at 0x0000000005765C18> <type 'function'>
方法是一类特殊的功能,可以绑定或不绑定。
class C: def c(self): pass print C.c # example of unbound method print type(C.c) print C().c # example of bound method print type(C().c) print C.c()
当然,如果不作为参数传递,则不能调用未绑定的方法。
输出结果
<function a at 0xb741b5a4> <type 'function'> <unbound method C.c> <type 'instancemethod'> <bound method C.c of <__main__.C instance at 0xb71ade0c>> <type 'instancemethod'> Traceback (most recent call last): File "~.py", line 11, in <module> print C.c() TypeError: unbound method c() must be called with C instance as first argument (got nothing instead)
在Python中,绑定方法,函数或可调用对象(即实现__call__方法的对象)或类构造函数之间没有太大区别。它们看起来都一样,只是具有不同的命名约定,尽管看起来很不一样。
这意味着可以将绑定方法用作函数,这是使Python如此强大的众多小功能之一
>>> d = A().a #this is a bound method of A()>>> d() # this is a function
这也意味着,即使len(...)和str(...)之间有根本的区别(str是类型构造函数),我们也不会注意到这一区别,直到我们更深入地研究:
>>>len <built-in function len> >>> str <type 'str'>