为什么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 次 |
| 最近记录: |