eco más asesoramiento Alex de micrófono y de la adición y de mi propio color ...
utilizando atributos de instancia son los Python típica, más idiomática. los atributos de clase no se suelen utilizar, al menos no en el código de producción en mis últimos 13 años consecutivos de Python. lo mismo es cierto para los métodos estáticos y de clase ... simplemente no es muy común a menos que exista un caso de uso específico o un programador aberrante que desee alardear de que conocen algún rincón oscuro de la programación de Python.
alex menciona en su respuesta que el acceso será (un poco) más rápido debido a un nivel menos de búsqueda ... Permítanme aclarar aún más para aquellos que aún no saben cómo funciona esto, es muy similar al acceso a variables - la búsqueda sucede en este orden:
- locales
- no locales
- globals
- empotrados
para acceder atributo, el orden es:
- ejemplo
- clase
- clases base que determine el MRO (método de resolución de orden)
en su ejemplo anterior, digamos que usted' Estamos buscando el atributo path
. cuando encuentra una referencia como "self.path
", Python examinará primero los atributos de instancia para una coincidencia; cuando eso falla, comprueba la clase desde la que se creó la instancia del objeto.finalmente, buscará las clases base. como ha dicho alex, si su atributo se encuentra en la instancia, no se someterá a la clase, por lo tanto ahorrará un poco de tiempo. Sin embargo
, si insiste en atributos de clase, tendrá que renunciar a esta pequeña gota de rendimiento, o, la otra alternativa es hacer referencia al objeto a través de la clase en lugar de la instancia, por ejemplo, MyController.path
vez de self.path
. esa es una búsqueda directa que sorteará la búsqueda diferida, pero como menciona Alex a continuación, esa es una variable global, por lo que pierde ese bit que pensó que iba a guardar (a menos que cree una referencia local al nombre de clase [global])
Después de leer esta pregunta y ver la respuesta, una de mis primeras preguntas fue: "Entonces, ¿cómo puedo acceder a las variables de clase?" - Eso es porque hasta este momento solo he usado variables de instancia. En respuesta a mi propia pregunta, lo haces a través del nombre de la clase en sí, aunque técnicamente puedes hacerlo a través de una instancia también. Aquí hay un enlace para leer para cualquier persona con la misma pregunta: http://stackoverflow.com/a/3434596/4561887 –