为什么python描述符中的__get__
方法接受所有者类作为它的第三个参数?你能给出一个使用它的例子吗?
第一个参数(self
)是不言而喻的,第二个(instances
)在通常显示的描述符模式的上下文中是有意义的(如下所示),但我从未真正看到owner
使用过的第三个().有人可以解释用例是什么吗?
仅仅通过参考和促进答案,这是我见过的描述符的典型用法:
class Container(object):
class ExampleDescriptor(object):
def __get__(self, instance, owner):
return instance._name
def __set__(self, instance, value):
instance._name = value
managed_attr = ExampleDescriptor()
Run Code Online (Sandbox Code Playgroud)
鉴于instance.__class__
可用,我能想到的是显式传递类与直接从类而不是实例(ex Container.managed_attr
)访问描述符有关.即便如此,我还不清楚__get__
在这种情况下会做些什么.
And*_*ark 10
owner
从类中而不是类的实例访问属性时使用,在这种情况下instance
将是None
.
在您的例子试图像print(Container.managed_attr)
将失败,因为instance
是None
如此instance._name
会引发一个AttributeError
.
您可以通过检查是否可以改进此行为instance is None
,并且可能有助于记录或引发更有用的异常以了解描述符所属的类,因此owner
属性.例如:
def __get__(self, instance, owner):
if instance is None:
# special handling for Customer.managed_attr
else:
return instance._name
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1249 次 |
最近记录: |