python __get__方法

God*_*Man 5 python descriptor getattribute

我正在阅读链接中描述符如何工作的解释:http://users.rcn.com/python/download/Descriptor.htm#properties.

但是,在这里,在类Property__get__方法下,我对方法签名有疑问.方法签名是:

def __get__(self, obj, objtype=None):

在这里,我知道何时以及如何obj可以是无或实际对象.

但是,我不明白:在何种情况下可以objtypeNone?而且,它在实际例子中是如何有用的.

unu*_*tbu 6

签名

def __get__(self, obj, objtype=None):
Run Code Online (Sandbox Code Playgroud)

说这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': <bound method ?.baz of <__main__.Foo object at 0xb787006c>>}
foo.baz()
# Hi
Run Code Online (Sandbox Code Playgroud)

相反,如果使用了2参数形式__get__,

foo.baz = Bar.baz.__get__(foo, foo.__class__)
Run Code Online (Sandbox Code Playgroud)

然后foo.baz未绑定的方法Bar.bazfoo.baz()加注

TypeError: unbound method baz() must be called with Bar instance as first argument (got nothing instead)
Run Code Online (Sandbox Code Playgroud)

请注意,在Python3 unbound method中已删除了概念.没有更多检查看到调用obj的类是正确的类型.所以在Python3中,用于定义foo.baz作品的1参数和2参数形式.

  • 那不是回答这个问题.当然,您可以手动调用它,但这不是重点. (2认同)

Mar*_*agh 1

python 文档在Implementing Descriptors下对此进行了很好的讨论。签名实际上是下面提供的。正如您提到的,实例可能为“无”,但所有者永远不应该为“无”。也许您阅读的方法有误。

object.__get__(self, instance, owner)
Run Code Online (Sandbox Code Playgroud)