Repitiendo aún más los consejos de Mike y Alex y agregando mi propio color ...
El uso de atributos de instancia es el típico ... el Python más idiomático. Los atributos de clase no se utilizan tanto, ya que sus casos de uso son específicos. Lo mismo ocurre con los métodos estáticos y de clase frente a los métodos "normales". Son construcciones especiales que abordan casos de uso específicos; de lo contrario, es un código creado por un programador aberrante que quiere presumir 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 más para aquellos que aún no saben cómo funciona esto. Es muy similar al acceso variable, cuyo orden de búsqueda es:
- lugareños
- no locales
- globales
- incorporados
Para el acceso a atributos, el orden es:
- ejemplo
- clase
- clases base determinadas por el MRO (orden de resolución del método)
Ambas técnicas funcionan de manera "de adentro hacia afuera", lo que significa que los objetos más locales se verifican primero, luego las capas externas se verifican sucesivamente.
En su ejemplo anterior, digamos que está buscando el path
atributo. Cuando encuentra una referencia como " self.path
", Python buscará primero en los atributos de la instancia una coincidencia. Cuando eso falla, verifica la clase desde la que se creó la instancia del objeto. Finalmente, buscará las clases base. Como dijo Alex, si su atributo se encuentra en la instancia, no necesita buscar en otro lado, de ahí su pequeño ahorro de tiempo.
Sin embargo, si insiste en los atributos de clase, necesita esa búsqueda adicional. O su otra alternativa es hacer referencia al objeto a través de la clase en lugar de la instancia, por ejemplo, en MyController.path
lugar de self.path
. Esa es una búsqueda directa que evitará la búsqueda diferida, pero como Alex menciona a continuación, 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] ).
La conclusión es que debe usar atributos de instancia la mayor parte del tiempo. Sin embargo, habrá ocasiones en las que un atributo de clase sea la herramienta adecuada para el trabajo. El uso de código que use ambos al mismo tiempo requerirá la mayor diligencia, porque el uso self
solo le dará el objeto de atributo de instancia y el acceso de sombras al atributo de clase del mismo nombre. En este caso, debe utilizar el acceso al atributo por el nombre de la clase para hacer referencia a él.