签名
def __get__(self, obj, objtype=None):
是说objtype是一个可选参数.如果仅使用一个参数调用__get__,则objtype将设置为None.
例如,Foo可以通过以下方式定义foo.baz来从Bar中窃取一个方法:
class Foo(object):
pass
class Bar(object):
def baz(self):
print('Hi')
foo = Foo()
foo.baz = Bar.baz.__get__(foo)
print(foo.__dict__)
# {'baz': >}
foo.baz()
# Hi
相反,如果使用了__get__的2参数形式,
foo.baz = Bar.baz.__get__(foo, foo.__class__)
然后foo.baz是未绑定的方法Bar.baz和foo.baz()引发
TypeError: unbound method baz() must be called with Bar instance as first argument (got nothing instead)
请注意,在Python3中,已删除了未绑定方法的概念.没有更多检查看到调用obj的类是正确的类型.所以在Python3中,用于定义foo.baz的1参数和2参数形式都有效.