2010-10-26 11 views
11

Ho cercato di utilizzare le proprietà invece di setter e getter specifici nella mia app. Sembrano più pitoni e generalmente rendono il mio codice più leggibile.Mi chiedo se dovrei limitarmi ad usare le proprietà in python

Più leggibile tranne per un problema: errori di battitura.

consideri il seguente esempio semplice (si noti, la mia proprietà in realtà fare un po 'di elaborazione, anche se gli esempi qui solo impostare o restituire una variabile semplice)

class GotNoClass(object): 

    def __init__(self): 
     object.__init__(self) 
     self.__a = None 

    def __set_a(self, a): 
     self.__a = a 

    def __get_a(self): 
     return self.__a 

    paramName = property(__get_a, __set_a) 


if __name__ == "__main__": 
    classy = GotNoClass() 

    classy.paramName = 100 
    print classy.paramName 

    classy.paranName = 200 
    print classy.paramName 

    #oops! Typo above! as seen by this line: 
    print classy.paranName 

L'uscita, come chiunque legga un po' da vicino vedrà , è:

100 
100 
200 

Oops. Non dovrebbe essere stato tranne il fatto che ho fatto un refuso - Ho scritto paranName (due n) invece di paramName.

Questo è facile eseguire il debug in questo semplice esempio, ma mi ha fatto male nel mio progetto più ampio. Dal momento che python crea felicemente una nuova variabile quando ho intenzionalmente inteso utilizzare una proprietà, ottengo degli errori sottili nel mio codice. Errori che sto trovando difficili da rintracciare a volte. Ancora peggio, una volta ho usato lo stesso errore di battitura due volte (una volta mentre stavo impostando e più tardi una volta mentre stavo ottenendo) quindi il mio codice sembrava funzionare ma molto più tardi, quando un altro ramo di codice alla fine ha provato ad accedere a questa proprietà (correttamente) Ho ottenuto il valore sbagliato - ma mi ci sono voluti diversi giorni prima che mi rendessi conto che i miei risultati erano solo un po 'spenti.

Ora che so che questo è un problema, passo più tempo a leggere da vicino il mio codice, ma idealmente avrei un modo per prendere automaticamente questa situazione - se mi manca solo uno posso introdurre un errore che non mostrare fino a quando un bel po 'di tempo è passato ...

Quindi mi chiedo, dovrei semplicemente passare a usare vecchi setter e getter? O c'è un modo pulito per evitare questa situazione? Le persone fanno affidamento su se stesse per intercettare manualmente questi errori? Purtroppo non sono un programmatore professionista, solo qualcuno che cerca di fare qualcosa qui al lavoro e non so davvero quale sia il modo migliore per affrontarlo.

Grazie.

P.S. Capisco che questo sia anche uno dei vantaggi di Python e non mi lamento di questo. Mi chiedo solo se sarebbe meglio usare setter e getter espliciti.

+0

La stessa cosa accade per gli attributi semplici, per non parlare delle variabili locali. È un effetto collaterale diretto del design del linguaggio e provare a "sistemarlo" causerà generalmente problemi più grandi. Non ho mai trovato che fosse un grosso problema, però. –

+0

Questo è assolutamente vero e dopo averlo postato ci ho pensato un po 'di più. Penso che la ragione per cui sta accadendo di più è che ora mi affido molto alle proprietà (rispetto ai miei vecchi setter e getter) e quindi sono più probabile che incappi in un errore del genere. Il trucco sarà quello di minimizzare il problema il più possibile e di essere più attento. – Ben

risposta

0

Ci sono momenti in cui il controllo in fase di compilazione fa risparmiare davvero tempo. Sembra che tu abbia identificato uno di questi casi. Per caso invece di una scelta accurata uso getter e setter e sono felice ;-)

2

A seconda di come funziona il tuo codice, potresti provare a utilizzare slots. Otterrai un'eccezione AttributeError generata quando proverai ad assegnare qualcosa che non è presente nelle slot, il che renderà più evidente tale errore di battitura.

+0

Wow.Le slot sono molto molto interessanti (e nuove per me). Li implementerò sicuramente come parte della mia app, ma non per risolvere questo problema. Per questo sembra che possa essere un abuso del loro scopo (il che, a mio avviso, è di ridurre l'impronta di memoria di oggetti che potrebbero essere istanziati molte volte). Una cosa che sto considerando, però, è di usarli temporaneamente durante lo sviluppo e poi spegnerli una volta che ho completato il mio codice - in questo modo mi terranno onesto adesso ma non saranno effettivamente in uso (o abuso?) Una volta che la mia app sarà completare. – Ben

+0

Ripensandoci, osservando alcune delle conseguenze non intenzionali dell'uso di __slots__, non le implementerò nemmeno durante lo sviluppo. Ancora molto bello da imparare però. – Ben