我正在学习python中的描述符。我想写一个非数据描述符,但是当我调用classmethod时,将描述符作为其classmethod的类不会调用__get__
特殊方法。这是我的例子(没有__set__
):
class D(object):
"The Descriptor"
def __init__(self, x = 1395):
self.x = x
def __get__(self, instance, owner):
print "getting", self.x
return self.x
class C(object):
d = D()
def __init__(self, d):
self.d = d
我这样称呼它:
>>> c = C(4)
>>> c.d
4
描述符类的__get__
没有得到调用。但当我同时设置__set__
时,描述符似乎被激活:
class D(object):
"The Descriptor"
def __init__(self, x = 1395):
self.x = x
def __get__(self, instance, owner):
print "getting", self.x
return self.x
def __set__(self, instance, value):
print "setting", self.x
self.x = value
class C(object):
d = D()
def __init__(self, d):
self.d = d
现在我创建一个C
实例:
>>> c=C(4)
setting 1395
>>> c.d
getting 4
4
并且__get__, __set__
都存在。似乎我缺少了一些关于描述符的基本概念以及如何使用它们。有人能解释__get__, __set__
的这种行为吗
您成功地创建了一个适当的非数据描述符,但随后通过设置实例属性来屏蔽
d
属性因为它是一个非数据描述符,所以实例属性在本例中获胜。添加
__set__
方法时,将描述符转换为数据描述符,即使存在实例属性,也始终应用数据描述符(*)从Descriptor Howto开始:
及
如果删除实例属性
d
(从不在实例中设置或删除它),则会调用描述符对象:再次添加实例属性,描述符将被忽略,因为实例属性获胜:
另请参见Python数据模型参考中的Invoking Descriptors documentation
(*),前提是数据描述符实现了
__get__
钩子。通过instance.attribute_name
访问这样的描述符将返回描述符对象,除非'attribute_name'
中存在instance.__dict__
相关问题 更多 >
编程相关推荐