Tengo algunas clases que están muy extendidas en mi aplicación Python y que deberían tener solo una instancia global (por ejemplo, Logger, DbConnection). Python no admite variables/métodos estáticos en una clase, por lo que la forma habitual de Java/C++ para crear un singleton aquí no funciona. He buscado alternativas para implementar singleton en Python. Quiero una implementación simple (sin metaprogramación si es posible) y limpia. Esto se ve bien:Globales y singletons en Python
class MyClass(object):
def a():
pass
singleton = MyClass()
Usando el singleton sería simple como
import myClass
myClass.singleton.a()
La asignación directa podría ser reemplazada por una función de creación de objeto de inicialización si no es tan simple.
También podría crear una getInstance() en el alcance del módulo y usarla siempre para obtener myObj.
Pregunta 1) ¿Esto funciona bien? El código del módulo (asignación myObj) solo se ejecuta la primera vez que se importa en algún otro módulo y myObj no se creará cada vez que importo este módulo en algún lugar.
Un método alternativo que he visto es utilizar un módulo global. Algo así como:
from myClass1 import MyClass1
from myClass2 import MyClass2
myObj1 = MyClass1()
myObj2 = MyClass2()
El uso de este:
import globals
globals.myObj1.a()
que tienden a preferir la primera alternativa.
Pregunta 2) Entre las 2 soluciones, ¿qué recomiendas?
Pregunta 3) Una tercera solución sería pasar los objetos generalizados como Logger a varias clases/funciones, pero esta no es una buena solución. ¿Hay una mejor solución que no se menciona aquí?
Soy consciente de las desventajas del uso de variables globales y singletons. Sin embargo, tener un estado global no es un gran problema en mi aplicación. Preferiré soluciones que tengan claridad de código y sean fáciles de usar.
la premis de su pregunta es incorrecta. primero, python admite métodos estáticos y variables. segundo, ¿por qué no está utilizando las bibliotecas estándar existentes para el registro y acceso a la base de datos? –
Python admite directamente variables/métodos estáticos (sin hack de anotación)? Su segunda pregunta se desvía del problema (implementación singleton), reemplaza las clases de acceso logging/db por cualquier clase que sea singleton y se usa ampliamente en una aplicación. –