Ho alcune classi che sono molto diffuse nella mia applicazione Python e che dovrebbero avere solo un'istanza globale (es. Logger, DbConnection). Python non supporta variabili/metodi statici in una classe, quindi il solito modo Java/C++ per creare un singleton qui non funziona. Ho cercato delle alternative per implementare singleton in Python. Voglio un semplice (non metaprogramming, se possibile) e l'implementazione pulita. Questo sembra buono:Globali e singleton in Python
class MyClass(object):
def a():
pass
singleton = MyClass()
Utilizzando il singoletto sarebbe semplice come
import myClass
myClass.singleton.a()
L'assegnazione diretta potrebbe essere sostituito da una funzione di creazione se inizializzazione dell'oggetto non è così semplice.
Potrei anche creare un getInstance() nello scope del modulo e usarlo sempre per ottenere myObj.
Domanda 1) Funziona bene? Il codice del modulo (assegnazione myObj) viene eseguito solo la prima volta che viene importato in qualche altro modulo e myObj non verrà creato ogni volta che importerò questo modulo da qualche parte?
Un metodo alternativo che ho visto è l'utilizzo di un modulo globale. Qualcosa di simile:
from myClass1 import MyClass1
from myClass2 import MyClass2
myObj1 = MyClass1()
myObj2 = MyClass2()
Usando questo:
import globals
globals.myObj1.a()
tendo a preferire la prima alternativa.
Domanda 2) Tra le 2 soluzioni, cosa consiglia?
Domanda 3) Una terza soluzione sarebbe passare gli oggetti diffusi come Logger a diverse classi/funzioni, ma questa non è una buona soluzione imho. C'è una soluzione migliore non menzionata qui?
Sono consapevole degli svantaggi dell'utilizzo di variabili globali e singleton. Tuttavia, avere uno stato globale non è un grosso problema nella mia applicazione. Preferirò soluzioni che abbiano chiarezza del codice e siano semplici da usare.
la premisità della tua domanda è sbagliata. per prima cosa, python supporta metodi e variabili statici. secondo, perché non stai usando le librerie standard esistenti per la registrazione e l'accesso al database? –
Python supporta direttamente metodi/variabili statiche (no annotation hack)? La seconda domanda si discosta dal problema (implementazione singleton), sostituisce le classi di accesso/accesso DB di qualsiasi classe che sia singleton ed è ampiamente utilizzata in un'applicazione. –