3 回答
TA贡献1820条经验 获得超10个赞
正如其他人指出的那样,它们使用称为描述符的语言功能。
当您通过类访问实际属性对象时,返回该属性对象的原因在于该属性Foo.hello如何实现__get__(self, instance, owner)特殊方法:
如果在实例上访问了描述符,则该实例作为适当的参数传递,并且owner是该实例的类。
当通过类访问它时,instance则为None且仅owner通过。该property对象认识到这一点并返回self。
除了“ 描述符”方法外,另请参阅《语言指南》中有关实现描述符和调用描述符的文档。
TA贡献1712条经验 获得超3个赞
为了使@properties正常工作,该类必须是object的子类。当该类不是对象的子类时,则首次尝试访问setter时,它实际上会创建一个名称较短的新属性,而不是通过setter进行访问。
以下无法正常工作。
class C(): # <-- Notice that object is missing
def __init__(self):
self._x = None
@property
def x(self):
print 'getting value of x'
return self._x
@x.setter
def x(self, x):
print 'setting value of x'
self._x = x
>>> c = C()
>>> c.x = 1
>>> print c.x, c._x
1 0
以下将正常工作
class C(object):
def __init__(self):
self._x = None
@property
def x(self):
print 'getting value of x'
return self._x
@x.setter
def x(self, x):
print 'setting value of x'
self._x = x
>>> c = C()
>>> c.x = 1
setting value of x
>>> print c.x, c._x
getting value of x
1 1
添加回答
举报