我有幾個在我的Python應用程序中普遍存在並且應該只有一個全局實例(例如Logger,DbConnection)的類。 Python不支持類中的靜態變量/方法,因此在這裏創建單例的常用Java/C++方式不起作用。我已經尋找了在Python中實現單例的替代方案。我想要一個簡單的(如果可能的話,不要編程)和乾淨的實現。這看起來很不錯:Python中的全局變量和單例
class MyClass(object):
def a():
pass
singleton = MyClass()
使用Singleton是簡單
import myClass
myClass.singleton.a()
直接分配可以由創建功能所取代,如果對象的初始化並非如此簡單。
我也可以在模塊範圍內創建一個getInstance(),並始終使用它來獲取myObj。
問題1)這工作正常嗎?模塊代碼(myObj賦值)僅在第一次將其導入其他模塊時運行,並且每次將該模塊導入某處時都不會創建myObj?
我看到的另一種方法是使用全局模塊。喜歡的東西:
from myClass1 import MyClass1
from myClass2 import MyClass2
myObj1 = MyClass1()
myObj2 = MyClass2()
使用此:
import globals
globals.myObj1.a()
我傾向於選擇第一種選擇。
問題2)在兩種解決方案之間,你有什麼建議?
問題3)第三種解決方案是將諸如Logger等廣泛的對象傳遞給幾個類/函數,但這不是一個好的解決方案。有沒有更好的解決方案在這裏沒有提到?
我知道使用全局變量和單例的缺點。但是,擁有一個全球性的國家在我的申請中並不是一個大問題。我更喜歡代碼清晰且易於使用的解決方案。
你問題的前提是錯誤的。首先,python支持靜態方法和變量。其次,爲什麼不使用現有的標準庫進行日誌記錄和數據庫訪問? –
Python直接支持靜態方法/變量(沒有註釋破解)?你的第二個問題偏離了這個問題(單例實現),用任何一個單例類代替logging/db訪問類,並且它在應用程序中被廣泛使用。 –