我试图了解Python中的描述符。我似乎无法理解的是描述符方法中的实例和所有者是什么:
object.__get__(self, instance, owner)
现在我已经读过documentation,说:
owner始终是所有者类,而instance是通过其访问属性的实例,或者当通过所有者访问属性时为None。
不幸的是,我无法理解这意味着什么。所有者是否引用课程本身?类对象?那么实例传递给它的目的是什么?
答案 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