我正在使用Python中的属性,我想知道这个@ propertyName.deleter装饰器是如何工作的。我可能错过了一些东西,我找不到谷歌的明确答案。
我想要实现的是当调用 deleter 行为时,我可以触发其他操作(例如:使用我的3d应用程序SDK)。
现在只是一个简单的print()似乎没有被触发。
使用 del(instance.property)删除属性时是否触发删除?
否则,我该如何实现?
class M():
def __init__(self):
self._m = None
@property
def mmm(self):
return self._m
@mmm.setter
def mmm(self, val):
self._m = val
@mmm.deleter
def mmm(self):
print('deleting') # Not printing
del(self._m)
if __name__ == '__main__':
i = M()
i.mmm = 150
print(i.mmm)
del(i.mmm)
print(i.mmm)
非常感谢(:
答案 0 :(得分:12)
让M成为新式的课程:
class M(object):
请参阅http://www.python.org/download/releases/2.2.3/descrintro/#property:
属性不适用于经典 课程,但你不清楚 尝试这个时出错。你明白了 方法将被调用,所以它出现了 工作,但在属性 赋值,经典类实例 将简单地设置其中的值 dict 没有调用属性的set方法,之后, 属性的get方法不会 叫做。 (你可以覆盖 setattr 来解决这个问题,但这会非常昂贵。)
答案 1 :(得分:8)
在Python 3中,您将看到print
的结果 - 然后是最后一次打印的AttributeError(因为_m
已消失)。您可能正在使用Python 2.6,在这种情况下,您需要将class
子句更改为class M(object):
以使M
成为新样式,然后您将获得与Python相同的行为3。