2009-12-16 69 views
8

我玩弄Python中的属性,我想知道这是如何@ propertyName.deleter装饰工程。我可能错过了一些东西,我找不到Google的明确答案。deleter装饰使用Python中的属性

我想实现的是当这个deleter行为被调用时,我可以触发其他动作(例如:使用我的3d应用程序SDK)。

现在只是一个简单的打印()似乎并没有被触发。

deleter当我使用删除属性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) 

 

非常感谢你(:

回答

9

让米新式类:

class M(object): 

http://www.python.org/download/releases/2.2.3/descrintro/#property

属性不经典 类工作,但你没有清楚地知道 错误,当你尝试这个。的GET 方法将被调用,所以才出现 工作,但在属性 分配,一个典型的类实例 只会设置在其 字典值,而无需调用的属性的设置方法,并在此之后, 的财产的get方法将不会被调用 。 (你可以重写 SETATTR来解决这个问题,但它是非常昂贵的。)

+0

确实不是一个明确的错误,谢谢为了快速回答。 – Xavier 2009-12-16 04:30:50

6

在Python 3,你会看到print的结果 - 然后最后打印一个AttributeError(因为_m已经消失)。您可能会使用Python 2.6,在这种情况下,您需要将class子句更改为class M(object):以使M为新样式,然后您将获得与Python 3中相同的行为。

+0

我的确在使用Python 2.6。谢谢亚历克斯你的时间 – Xavier 2009-12-16 04:26:40

+1

@Xavier,你是特殊的SO行为,感谢我,感谢并接受unutbu - 而不是upvote一个或两个答案!当你喜欢答案(或者问题)时,你应该注意它 - 这就是保持系统正常工作的原因。 – 2009-12-16 05:25:31

+0

@亚历克斯,谢谢你指出(: - 我的坏。 – Xavier 2009-12-16 14:06:22