在 Python 中使用属性的删除器装饰器
Posted
技术标签:
【中文标题】在 Python 中使用属性的删除器装饰器【英文标题】:deleter decorator using Property in Python 【发布时间】:2010-12-27 02:26:16 【问题描述】:我正在使用 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)
非常感谢(:
【问题讨论】:
【参考方案1】:让 M 成为一个新风格的类:
class M(object):
见http://www.python.org/download/releases/2.2.3/descrintro/#property:
属性不适用于经典 类,但你不清楚 尝试此操作时出错。你得到 方法将被调用,所以它出现 工作,但取决于属性 assignment,一个经典的类实例 将简单地设置其值 dict 不调用属性的 set 方法,然后, 属性的 get 方法不会 称为。 (你可以覆盖 setattr 来解决这个问题,但它会非常昂贵。)
【讨论】:
【参考方案2】:在 Python 3 中,您会看到 print
的结果——然后是最后一次打印的 AttributeError(因为 _m
已经消失)。您可能正在使用 Python 2.6,在这种情况下,您需要将 class
子句更改为 class M(object):
以使 M
成为新样式,然后您将获得与 Python 3 中相同的行为。
【讨论】:
以上是关于在 Python 中使用属性的删除器装饰器的主要内容,如果未能解决你的问题,请参考以下文章
python进阶之装饰器之2.定义一个可接受参数的装饰器如何定义一个属性可由用户修改的装饰器定义一个能接受可选参数的装饰器