为什么 python descriptor 中的 __get__
方法?接受所有者类作为它的第三个参数?你能举例说明它的用途吗?
第一个参数 (self
) 是不言自明的,第二个参数 (instances
) 在典型显示的描述符模式的上下文中有意义(接下来是示例),但是我从未真正见过第三个(所有者
)被使用过。有人可以解释一下它的用例吗?
仅作为引用和方便的答案,这是我见过的描述符的典型用法:
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()
鉴于 instance.__class__
可用,我能想到的是显式传递类与直接从类而不是实例访问描述符有关(例如 Container .managed_attr
).即便如此,我也不清楚在这种情况下在 __get__
中会做什么。
最佳答案
owner
当从类而不是类的实例访问属性时使用,在这种情况下 instance
将为 None
.
在您的示例中尝试类似 print(Container.managed_attr)
的操作会失败,因为 instance
是 None
所以 instance._name
会引发一个 AttributeError
。
您可以通过检查 instance 是否为 None
来改进此行为,这可能有助于记录或引发更有用的异常以了解描述符属于哪个类,因此 owner
属性。例如:
def __get__(self, instance, owner):
if instance is None:
# special handling for Customer.managed_attr
else:
return instance._name
关于python - 为什么 python 描述符 __get__ 方法接受所有者类作为参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8719585/