2009-12-16 15 views
8

Mi sto divertendo con la proprietà in Python e mi chiedevo come funzioni questo decoratore @ propertyName.deleter. Probabilmente mi manca qualcosa, non ho trovato risposte chiare da parte di Google.decoratore deleter usando Proprietà in Python

Quello che mi piacerebbe ottenere è quando viene chiamato questo comportamento del deleter , posso attivare altre azioni (ad esempio utilizzando l'SDK dell'applicazione 3d).

Per ora solo una semplice stampa() non sembra essere attivata.

È deleter sparato quando elimino la struttura utilizzando del (instance.property)?

Altrimenti, come posso ottenere questo?

 

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) 

 

Grazie mille (:

risposta

9

Fai M una classe di nuovo stile:

class M(object): 

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

Proprietà non funzionano per classici classi, ma non si ottiene un chiaro errore quando provi questo. Il vostro metodo get sarà chiamato, in modo che appaia a lavorare, ma su di attributo assegnazione, un'istanza di classe classico sarà sufficiente impostare il valore nella sua dict senza chiamare metodo set della proprietà, e dopo che, il il metodo get della proprietà non sarà chiamato. (Si potrebbe ignorare setattr per risolvere questo problema, ma sarebbe proibitivo.)

+0

infatti un evidente errore, grazie per la risposta veloce. – Xavier

6

In Python 3 si dovrebbe vedere il risultato s' print - e poi un AttributeError per l'ultimo di stampa (a causa _m è scomparso). Si può utilizzare Python 2.6, nel qual caso è necessario modificare la clausola class-class M(object): per rendere M new-style, e quindi si otterrà lo stesso comportamento in Python 3.

non
+0

Sto davvero usando Python 2.6. Grazie Alex per il tuo tempo – Xavier

+1

@Xavier, il tuo è un comportamento SO particolare, per ringraziarmi, grazie E accetto unutbu - e non con una o nessuna delle due o entrambe le risposte! Quando ti piace una risposta (o una domanda anche tu) dovresti revocarla - questo è ciò che fa funzionare il sistema. –

+0

@Alex, grazie per averlo indicato (: - il mio male. – Xavier

Problemi correlati