Facendo eco ai consigli di Mike e Alex e aggiungendo il mio colore ...
L'uso degli attributi di istanza è il tipico ... il più idiomatico Python. Gli attributi di classe non vengono utilizzati molto, poiché i loro casi d'uso sono specifici. Lo stesso vale per i metodi statici e di classe rispetto ai metodi "normali". Sono costrutti speciali che affrontano casi d'uso specifici, altrimenti è codice creato da un programmatore aberrante che vuole mostrare di conoscere qualche angolo oscuro della programmazione Python.
Alex menziona nella sua risposta che l'accesso sarà (un po ') più veloce a causa di un livello di ricerca in meno ... lasciatemi chiarire ulteriormente per coloro che non sanno ancora come funziona. È molto simile all'accesso alle variabili, il cui ordine di ricerca è:
- gente del posto
- nonlocals
- globali
- built-in
Per l'accesso agli attributi, l'ordine è:
- esempio
- classe
- classi di base come determinato dall'MRO (ordine di risoluzione del metodo)
Entrambe le tecniche funzionano in modo "rovesciato", il che significa che gli oggetti più locali vengono controllati prima, quindi gli strati esterni vengono controllati in successione.
Nel tuo esempio sopra, diciamo che stai cercando l' path
attributo. Quando incontra un riferimento come " self.path
", Python cerca prima gli attributi dell'istanza per una corrispondenza. Quando fallisce, controlla la classe da cui è stata creata l'istanza dell'oggetto. Infine, cercherà le classi di base. Come ha affermato Alex, se il tuo attributo si trova nell'istanza, non ha bisogno di cercare altrove, da qui il tuo piccolo risparmio di tempo.
Tuttavia, se insisti sugli attributi di classe, hai bisogno di quella ricerca extra. Oppure , l'altra alternativa è fare riferimento all'oggetto tramite la classe anziché l'istanza, ad esempio MyController.path
invece di self.path
. Questa è una ricerca diretta che aggira la ricerca differita, ma come alex menziona di seguito ,èuna variabile globale, quindi perdi quel bit che pensavi di salvare (a meno che tu non crei un riferimento locale al nome della classe [globale] ).
La conclusione è che dovresti usare gli attributi di istanza la maggior parte del tempo. Tuttavia, ci saranno occasioni in cui un attributo di classe è lo strumento giusto per il lavoro. Il codice che utilizza entrambi allo stesso tempo richiederà la massima diligenza, perché l'utilizzo self
ti darà solo l'oggetto dell'attributo di istanza e l' accesso alle ombre all'attributo di classe con lo stesso nome. In questo caso, è necessario utilizzare l'accesso all'attributo dal nome della classe per fare riferimento ad esso.