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.
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ò. –
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