eco ulteriori consigli di Mike e Alex e aggiungendo il mio colore ...
utilizzando gli attributi istanza sono il tipico, Python più idiomatica. gli attributi di classe non sono spesso usati - almeno non nel codice di produzione negli ultimi 13 anni consecutivi di Python. lo stesso vale per i metodi statici e di classe ... non molto comuni a meno che non ci sia un caso d'uso specifico o un programmatore aberrante che vuole mostrare di conoscere qualche angolo oscuro della programmazione Python.
alex cita nella sua risposta che l'accesso sarà (un po ') più veloce a causa di un livello inferiore di ricerca ... chiarisco ulteriormente per coloro che non sanno come funziona ancora, è molto simile per l'accesso variabili - la ricerca avviene in questo modo:
- locali
- nonlocals
- GLOBALS
- built-in
per l'accesso di attributo, l'ordine è:
- esempio
- classe
- classi base come determinato dal MRO (ordine di risoluzione metodo)
nel tuo esempio sopra, diciamo che si' sto cercando l'attributo path
. quando incontra un riferimento come "self.path
", Python esaminerà prima gli attributi di istanza per una corrispondenza; quando fallisce, controlla la classe da cui è stato istanziato l'oggetto.infine, cercherà le classi base. come ha affermato alex, se il tuo attributo si trova nell'istanza, non verrà rimandato alla classe, quindi il tuo piccolo risparmio di tempo.
tuttavia, se ti ostini a attributi di classe, si dovrà rinunciare a questo piccolo pezzo di prestazioni, o, l'altra alternativa è quella di fare riferimento all'oggetto tramite la classe al posto dell'istanza, ad esempio, MyController.path
invece di self.path
. questa è una ricerca diretta che aggirerà la ricerca differita, ma come menziona alex sotto, questa è una variabile globale, quindi perdi quel pezzo che pensavi di voler salvare (a meno che non crei un riferimento locale al nome della classe [globale]).
Dopo aver letto questa domanda e aver visto la risposta, una delle mie prime domande è stata: "Come posso accedere alle variabili di classe?" - Questo perché fino a questo punto ho usato solo variabili d'istanza. In risposta alla mia domanda, lo fai tramite il nome della classe stessa, anche se tecnicamente puoi farlo anche tramite un'istanza. Ecco un link da leggere per chiunque altro con la stessa domanda: http://stackoverflow.com/a/3434596/4561887 –