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

Fin*_*inn 15 python

为什么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)将失败,因为instanceNone如此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)