在 Python 函数和 Python 对象方法之间,哪个更基础?


函数是 Python 中的可调用对象,即可以使用调用运算符进行调用。但是,其他对象也可以通过实现 __call__ 方法来模拟函数。

示例

def a(): pass # a() is an example of function
print a
print type(a)

输出

C:/Users/TutorialsPoint/~.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'>

更新于: 2020年2月13日

110 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告