Clases estáticas en Python

Una vez leí (creo que en una página de Microsoft) que es una buena manera de usar clases estáticas, cuando no NECESITAS dos o más instancias de una clase.

Estoy escribiendo un progtwig en Python. ¿Es un estilo malo, si uso @classmethod para cada método de una clase?

En mi experiencia, crear una clase es una muy buena solución por varias razones. Una es que terminas usando la clase como una clase “normal” (especialmente haciendo más de una instancia) más a menudo de lo que piensas. También es una opción de estilo razonable seguir las clases para todo; Esto puede hacer que sea más fácil para otras personas que leen / mantienen su código, especialmente si son muy poco organizados, se sentirán cómodos con las clases. Como se señaló en otras respuestas, también es razonable usar funciones ‘simples’ para la implementación. Tal vez desee comenzar con una clase y convertirla en un patrón singleton / Borg (muchos ejemplos si busca en Google para estos); le brinda la flexibilidad de (re) usar la clase para satisfacer otras necesidades. Yo recomendaría que el enfoque de ‘clase estática’ sea no convencional y no pythonico, lo que dificulta su lectura y mantenimiento.

En general, el uso de este tipo se realiza mejor utilizando las funciones de un módulo, sin ninguna clase.

Es un estilo terrible, a menos que realmente necesites acceder a la clase.

Un método estático […] no se traduce a un método de clase Python. Oh, claro, da como resultado más o menos el mismo efecto, pero el objective de un método de clase en realidad es hacer algo que generalmente ni siquiera es posible […] (como heredar un constructor no predeterminado). La traducción idiomática de un método […] estático generalmente es una función de nivel de módulo, no un método de clase o método estático.

fuente

Hay algunos enfoques que podría tomar para esto. Como otros han mencionado, usted podría usar funciones de nivel de módulo. En este caso, el módulo en sí es el espacio de nombres que los mantiene unidos. Otra opción, que puede ser útil si necesita realizar un seguimiento del estado, es definir una clase con métodos normales (tomar uno mismo), y luego definir una instancia global única de ella, y copiar sus métodos de instancia al espacio de nombres del módulo. Este es el enfoque adoptado por el módulo “aleatorio” de la biblioteca estándar: eche un vistazo a lib/python2.5/random.py en su directorio de python. En la parte inferior, tiene algo como esto:

 # Create one instance, seeded from current time, and export its methods # as module-level functions. [...] _inst = Random() seed = _inst.seed random = _inst.random uniform = _inst.uniform ... 

O puede tomar el enfoque básico que describió (aunque recomendaría usar @staticmethod lugar de @classmethod en la mayoría de los casos).

Es posible que desee una clase singleton en lugar de una clase estática: Crear una clase singleton en python