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

18 投票
2 回答
15093 浏览
提问于 2025-04-15 17:04

我在玩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来解决这个问题,但这样做会非常耗费资源。)

撰写回答