访问函数名称将调用描述符协议,该协议在函数对象上返回绑定方法。
绑定方法是围绕功能对象的薄包装器。它存储了对原始函数和实例的引用。调用方法对象时,它依次将调用传递给函数,并插入实例作为第一个参数。
创建实例时不会创建方法,因此不需要先验的额外内存。
您可以手动重新创建步骤:
>>> class A:
... def __init__(self, name):
... self.name = name
... def foo(self):
... print(self.name)
...
>>> a = A('One')
>>> a.foo
<bound method A.foo of <__main__.A object at 0x100a27978>>
>>> a.foo.__self__
<__main__.A object at 0x100a27978>
>>> a.foo.__func__
<function A.foo at 0x100a22598>
>>> A.__dict__['foo']
<function A.foo at 0x100a22598>
>>> A.__dict__['foo'].__get__(a, A)
<bound method A.foo of <__main__.A object at 0x100a27978>>
>>> A.__dict__['foo'].__get__(a, A)()
One
>>> a.foo is a.foo
False
>>> b = A('Two')
>>> b.foo is a.foo
False
>>> b.foo.__func__ is a.foo.__func__
True
这种架构也使得classmethod
,staticmethod
和property
对象。您可以创建自己的描述符,创建大量有趣的绑定行为。