Come posso smettere di sovrascrivere le variabili membro con "nuove"?

5

La maggior parte della mia esperienza di programmazione è stata con C ++ e (shudder) FORTRAN (sono uno scienziato non un programmatore in quanto tale, ma faccio del mio meglio). Recentemente ho iniziato a usare Python in modo estensivo e lo trovo fantastico. Tuttavia, ho trascorso poche ore frustranti rintracciare un bug che è risultato causato dalla creazione di un nuovo membro dell'oggetto in una funzione, ad es.

def some_func(self):
    self.some_info = list()

ma, avevo già creato altrove il membro some_info per questo oggetto per uno scopo diverso, quindi le cose brutte ovviamente sono successe in seguito, ma era difficile risalire a questo punto.

Ora ovviamente in un linguaggio come C ++ questo è impossibile da fare, dato che non puoi semplicemente creare membri dell'oggetto al volo. Poiché sono abituato al linguaggio che si occupa di questo, non ho una disciplina procedurale ben sviluppata per impedirmi di abusare della libertà fornita da python (e altre lingue digitate dinamicamente).

Quindi qual è il modo migliore per prevenire questo tipo di errore quando si usano linguaggi come python?

    
posta Bogdanovist 05.09.2013 - 03:15
fonte

4 risposte

10

Questo può essere un consiglio un po 'banale, ma cerca di non creare attributi al di fuori del metodo __init__ (specialmente non al di fuori dei metodi della classe), a meno che tu non ne abbia davvero bisogno. pylint cattura questo, tra molte altre cose.

Naturalmente, c'è ancora la possibilità di riassegnare un attributo esistente a qualcos'altro interamente, ma almeno si avrà un singolo posto in cui è possibile vedere tutti gli attributi contemporaneamente. Inoltre, questo garantirà che subito dopo la costruzione il tuo oggetto sia valido e non richieda chiamate a nessun altro metodo interno che modifica lo stato.

    
risposta data 05.09.2013 - 04:01
fonte
5

In poche parole, rendi le tue classi più piccole, abbastanza piccole da poter facilmente individuare tali conflitti. Di solito quando non riesci a trovare un modo per creare un membro in __init__ è un buon segno che potresti voler dividerlo nella sua stessa classe. Inoltre, evita di usare un membro quando lo farà una variabile locale.

Quando un linguaggio di programmazione non impone pratiche, devi imporle tu stesso.

    
risposta data 05.09.2013 - 04:19
fonte
4

I had already created elsewhere the member some_info for this object for a different purpose

Bene, non hai pubblicato i nomi reali della tua classe e dei membri, ma tali cose possono accadere più facilmente quando some_info ha un nome ambiguo, non chiarendo che è un vero scopo. Quindi, oltre alle altre buone risposte qui, cerca di evitarlo, scegli nomi che documentino più chiaramente lo scopo di una variabile, in particolare per le variabili membro .

    
risposta data 05.09.2013 - 07:44
fonte
-2

Non puoi. Se si tratta di un problema che si verifica su base regolare, Python (e probabilmente altre lingue digitate dinamicamente sono una cattiva scelta per te.

    
risposta data 05.09.2013 - 13:06
fonte