2009-12-16 7 views
8

Je joue avec la propriété en Python et je me demandais comment fonctionne ce décorateur @ propertyName.deleter. Il me manque probablement quelque chose, je n'ai pas trouvé de réponses claires par Google. Ce que je voudrais accomplir, c'est quand ce comportement deleter est appelé, je peux déclencher d'autres actions (par exemple: en utilisant mon SDK application 3D).deleter décorateur en utilisant la propriété en Python

Pour l'instant, un simple print() ne semble pas déclenché.

est-Deleter tiré lorsque je supprime la propriété à l'aide del (instance.property)?

Sinon, comment puis-je y parvenir?

 

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) 

 

Merci beaucoup (:

Répondre

9

Faire M une nouvelle classe de style:

class M(object): 

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

Propriétés ne fonctionnent pas pour classiques des classes, mais vous n'obtenez pas un clair erreur lorsque vous essayez ceci. Votre méthode get sera appelé, il semble donc au travail, mais sur l'affectation attribut , une instance de classe classique définit simplement la valeur dans sa dict sans faire appel à la méthode de jeu de la propriété, et après cela, la La méthode get de la propriété ne sera pas appelée . (Vous pouvez passer outre setattr pour résoudre ce problème, mais il serait prohibitif.)

+0

En effet pas une erreur claire, merci pour la réponse rapide. – Xavier

6

En Python 3, vous verriez le résultat d » print - puis un AttributeError pour la dernière impression (parce que _m a disparu). Vous utilisez peut-être Python 2.6, auquel cas vous devez modifier la clause class à class M(object): pour créer M nouveau style, puis vous obtiendrez le même comportement que dans Python 3.

+0

J'utilise en effet Python 2.6. Merci Alex pour votre temps – Xavier

+1

@Xavier, le vôtre est un comportement particulier de SO, pour me remercier, remercier et accepter unutbu - et pas upvote l'une ou l'autre des réponses! Lorsque vous aimez une réponse (ou une question, aussi), vous êtes censé l'augmenter - c'est ce qui fait fonctionner le système. –

+0

@Alex, merci de souligner cela (: - ma mauvaise. – Xavier

Questions connexes