我正在学习Python中的描述符。我想编写一个非数据描述符,但是将描述符作为其类方法的类在调用类方法时不会调用__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__
的这种行为吗?
__set__
,那会怎样?这是什么意思? - BAKE ZQClass.set_descriptor
,而instance
是Class
的实例,则在访问instance.set_descriptor
时,取决于instance.__dict__['set_descriptor']
是否存在,以确定返回描述符还是实例属性值。 - Martijn Pieters__set__
方法的描述符,在尝试设置属性名时总是会被调用。 - Martijn Pieters