Python函数对象是descriptors,Python使用描述符协议将函数绑定到实例。这个过程产生一个边界方法。在
绑定是调用方法时出现“magic”self参数的原因,也是当您试图将属性用作实例上的属性时,property对象自动调用方法的原因。在
当您试图使用一个描述符协议来查找父类上的方法时,带有两个参数的super()调用同一个描述符协议;super(Foo, self).bar()将遍历Foo父类,直到找到属性bar,如果该对象是描述符,则它将绑定到self。调用bar然后调用绑定方法,该方法反过来调用作为self参数传入的函数bar(self)。在
为此,super()对象存储要绑定的类(第一个参数)和self(第二个参数),和分别将__thisclass__、__self__和{}属性绑定在一起:>>> class Foo:
... def bar(self):
... return 'bar on Foo'
...
>>> class Spam(Foo):
... def bar(self):
... return 'bar on Spam'
...
>>> spam = Spam()
>>> super(Spam, spam)
, >
>>> super(Spam, spam).__thisclass__
>>> super(Spam, spam).__self__
>>> super(Spam, spam).__self_class__
在