Python描述符中的实例和所有者的目的是什么?

时间:2019-03-08 12:25:58

标签: python python-descriptors

我试图了解Python中的描述符。我似乎无法理解的是描述符方法中的实例和所有者是什么:

object.__get__(self, instance, owner)

现在我已经读过documentation,说:

  

owner始终是所有者类,而instance是通过其访问属性的实例,或者当通过所有者访问属性时为None。

不幸的是,我无法理解这意味着什么。所有者是否引用课程本身?类对象?那么实例传递给它的目的是什么?

3 个答案:

答案 0 :(得分:0)

  

所有者是否引用课程本身?

是的

  

类对象?

这是完全一样的东西。

  

那么实例传递给它的目的是什么?

描述符将如何访问在其他实例上查找过的实例?例如,如果您使用内置的property类型,则它通过存储访问器函数并回调这些函数来工作。这些函数将当前实例作为第一个参数(规范地命名为“ self”)。如果描述符未获取当前实例,则显然无法将其传递给访问器。

答案 1 :(得分:0)

可以通过以下代码说明这些关系:

class DescriptorClass:
    def __get__(self, instance, owner):
        return self, instance, owner

class OwnerClass:
    descr = DescriptorClass()

ownerinstance = OwnerClass()

self, instance, owner = ownerinstance.descr

assert self is OwnerClass.__dict__['descr']
assert instance is ownerinstance
assert owner is OwnerClass

self, instance, owner = OwnerClass.descr
assert instance is None

答案 2 :(得分:0)

考虑这个

 __get__(self, instance, owner):

owner-这是指创建描述符对象的类,请记住描述符对象是在类级别定义的。

instance-这是指您在其中定义了描述符对象的owner类的对象。

instance传递给描述符的__get__方法的目的是确保我们知道并标识您正在从owner类的哪个对象访问描述符实例。

由于描述符对象是在类级别创建的,因此描述符类本身的幼稚实现可能会导致owner类的多个对象覆盖描述符实例的值。这是此类代码的示例

def __get__(self, instance, owner):
    return self.data

def __set__(self, instance, data):
    if value < 1:
        raise Exception("Negative or zero is not allowed")
    else:
        self.data = value

因此,在上面的示例中,data的值仅存储在描述符实例中,并且如果您要创建owner类的多个对象,则这些代码将产生严重的副作用。对象正在设置data的值。

因此,为了解决此问题,您需要将data的值存储在__dict__的{​​{1}}中,但是如果您无权访问{描述符类本身中的{1}}?因此,根据我的经验,这是在描述符类中使用instance的主要目的。作为解决上述问题并使用instance的参考,下面是代码

instance