在 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 中使用属性的删除器装饰器的主要内容,如果未能解决你的问题,请参考以下文章