python - 为什么 python 描述符 __get__ 方法接受所有者类作为参数?

标签 python

为什么 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) 的操作会失败,因为 instanceNone 所以 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/

相关文章:

python - Itertools 停止连续重复的字符

python - 如何在不忘记在子类中添加属性装饰器的情况下覆盖抽象属性方法?

python - 代码运行缓慢 - python 中的性能问题

python - 错误: Series is ambiguous | Function with multiple arguments | DataFrame

python - 对 .xml 文件中 <P> 内的句子进行编号?

Python/MySQL : Select data in a for loop

python - 如何重复一个函数n次

python - 在 Python 中使用循环创建数组的交替列表

python - 如何 "rowise merge" Pandas 数据帧

python - 需要更好地了解 rtol、atol 在 scipy.integrate.odeint 中的工作方式