2009-12-16 11 views
8

Ich bin mit der Eigenschaft in Python herumspielen und ich frage mich, wie diese @ propertyName.deleter Dekorator funktioniert. Vermutlich vermisse ich etwas, ich konnte keine klaren Antworten von Google finden.Delete Decorator mit der Eigenschaft in Python

Was ich erreichen möchte ist, wenn diese Verhalten Verhalten aufgerufen wird, kann ich andere Aktionen auslösen (z. B. mit meiner 3D-Anwendung SDK).

Für jetzt scheint nur ein einfacher print() nicht ausgelöst werden.

Ist deleter ausgelöst, wenn ich die Eigenschaft löschen mit del (instance.property)?

Ansonsten, wie kann ich das erreichen?

 

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) 

 

Vielen Dank (:

Antwort

9

M Machen Sie einen neuen Stil Klasse:

class M(object): 

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

Eigenschaften funktionieren nicht für klassische Klassen, aber Sie erhalten keine klare Fehler, wenn Sie dies versuchen. Ihre get Methode wird aufgerufen, so scheint es, zu arbeiten, aber auf Attribut Zuordnung, eine klassische Klasseninstanz einfach den Wert in seiner dict ohne die Eigenschaft Set-Methode aufrufen, und danach, die Die get-Methode der Eigenschaft wird nicht genannt. (Sie könnten setattr außer Kraft setzen dieses Problem zu beheben, aber es wäre unerschwinglich teuer sein.)

+0

In der Tat kein klarer Fehler, danke für die schnelle Antwort. – Xavier

6

In Python 3 Sie print ‚s Ergebnis sehen würden, - und dann ein Attribut für den letzten Druck (weil _m ist verschwunden). Möglicherweise verwenden Sie Python 2.6, in diesem Fall müssen Sie die class -Klausel zu class M(object): ändern, um M neuen Stil zu machen, und dann erhalten Sie das gleiche Verhalten wie in Python 3.

+0

Ich benutze tatsächlich Python 2.6. Danke Alex für deine Zeit – Xavier

+1

@ Xavier, dein ist eigenartig SO Verhalten, um mir zu danken, danke und akzeptieren unutbu - und nicht upvote eine oder beide Antworten! Wenn du eine Antwort (oder Frage) magst, solltest du sie verbessern - das ist es, was das System am Laufen hält. –

+0

@Alex, danke für das Hinweis (: - meine schlechte. – Xavier