删除装饰器使用Python中的属性

时间:2009-12-16 04:11:41

标签: python properties decorator

我正在使用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)


非常感谢(:

2 个答案:

答案 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。