define python class static instance class-method

define - Clases estáticas en Python



#define python (5)

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 programa en Python. ¿Es un estilo malo, si uso @classmethod para cada método de una clase?


En general, el uso de este tipo se realiza mejor simplemente usando funciones en un módulo, sin una clase en absoluto.


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. Es posible que 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 pitónico, lo que hace que sea más difícil de leer y mantener.



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 objetivo 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.

source


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 juntos. 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 en el 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).