在Python中使用属性的deleter decorator

在Python中使用属性的deleter decorator,python,properties,decorator,Python,Properties,Decorator,我正在用Python处理属性,我想知道@propertyName.deleter decorator是如何工作的。我可能遗漏了什么,我无法通过谷歌找到清晰的答案 我希望实现的是,当调用此删除器行为时,我可以触发其他操作(例如:使用我的3d应用程序SDK) 目前,似乎没有触发一个简单的print() 当我使用del(instance.property)删除属性时,是否触发了deleter 否则,我如何才能做到这一点 class M(): def __init__(self):

我正在用Python处理属性,我想知道@propertyName.deleter decorator是如何工作的。我可能遗漏了什么,我无法通过谷歌找到清晰的答案

我希望实现的是,当调用此删除器行为时,我可以触发其他操作(例如:使用我的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)


非常感谢(:

让我成为一个新型的班级:

class M(object):
见:

属性不适用于classic 类,但您没有获得明确的 尝试此操作时出错。获取 方法将被调用,看起来是这样的 工作,但取决于属性 赋值,一个经典的类实例 只需在其 dict而不调用属性的set方法,然后, 属性的get方法将不可用 两个都打过电话。(你可以覆盖。) setattr来修复此问题,但其成本将高得令人望而却步。)


在Python3中,您将看到
print
的结果,然后是最后一次打印的AttributeError(因为
\u m
已消失)。您可能正在使用Python2.6,在这种情况下,您需要将
class
子句更改为
class m(object):
创建
M
新样式,然后您将获得与Python 3相同的行为