Hay algunos enfoques que puede tomar para esto. Como otros lo han mencionado, puedes 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 (tomando self), y luego definir una única instancia global de la misma 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: echa un vistazo a lib/python2.5/random.py
en tu directorio python. En la parte inferior, que 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 ha descrito (aunque yo recomendaría usar @staticmethod
en lugar de @classmethod
en la mayoría de los casos).
La mayor parte de su respuesta, siendo las excepciones principales la segunda y la última oración, es discutible (y tiendo a estar en desacuerdo) y además del punto. Yo diría que cortar toda la pelusa sobre cómo las grandes clases lo mejorarían, ¿qué piensas? – delnan
Estoy de acuerdo y en desacuerdo con esta respuesta al mismo tiempo. Así que no puedo decidir si presionar el botón hacia arriba o hacia abajo. De todos modos, estoy de acuerdo con los Objetos que hacen que el código sea más fácil de leer y mantener. No estoy de acuerdo con el uso del patrón singleton/borg http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Singleton.html. No es que sea un mal patrón; sin embargo, usar métodos estáticos con variables de clase es mucho más fácil de mantener y leer en un proyecto de código extremadamente complicado. Sí, esto puede no ser técnicamente correcto, pero los programadores de nivel junior te lo agradecerán. –