God*_*Man 5 python descriptor getattribute
我正在阅读链接中描述符如何工作的解释:http://users.rcn.com/python/download/Descriptor.htm#properties.
但是,在这里,在类Property的__get__方法下,我对方法签名有疑问.方法签名是:
def __get__(self, obj, objtype=None):
在这里,我知道何时以及如何obj可以是无或实际对象.
但是,我不明白:在何种情况下可以objtype是None?而且,它在实际例子中是如何有用的.
签名
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.baz并foo.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参数形式.
python 文档在Implementing Descriptors下对此进行了很好的讨论。签名实际上是下面提供的。正如您提到的,实例可能为“无”,但所有者永远不应该为“无”。也许您阅读的方法有误。
object.__get__(self, instance, owner)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3341 次 |
| 最近记录: |