在Python中使用属性的删除器装饰器
我在玩Python中的属性功能,想知道这个 @propertyName.deleter 装饰器是怎么工作的。我可能有些地方没理解清楚,谷歌上也找不到明确的答案。
我想实现的是,当这个 deleter 被调用时,我可以触发其他操作(比如使用我的3D应用程序SDK)。
目前简单的 print() 似乎没有被触发。
当我用 del(instance.property) 删除这个属性时,deleter 会被调用吗?
如果不会,我该怎么实现这个功能呢?
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)
非常感谢(:
2 个回答
9
在Python 3中,你会看到print
的结果,然后会出现一个属性错误(AttributeError),这是因为_m
已经消失了。如果你在使用Python 2.6,那么你需要把class
这一行改成class M(object):
,这样M
就变成了新式类,这样你就能得到和Python 3一样的表现了。
16
把 M 变成一个新式类:
class M(object):
可以查看这个链接:http://www.python.org/download/releases/2.2.3/descrintro/#property:
属性在经典类中是无法使用的,但是当你尝试这样做时,并不会得到明确的错误提示。你的获取方法会被调用,看起来好像是正常工作的,但当你给属性赋值时,经典类的实例会直接在它的字典中设置值,而不会调用属性的设置方法。之后,属性的获取方法也不会被调用。(你可以重写setattr来解决这个问题,但这样做会非常耗费资源。)