1 回答

TA貢獻1808條經(jīng)驗 獲得超4個贊
單例模式在 Python 中毫無意義。幾乎總是,你最好使用模塊?;蛘咭恍┕S功能作為您的主要構造 API,例如 .getLogger
如果你真的堅持讓你的類表面上成為一個單例(這總是可以被顛覆的),我建議元類方法,因為它回避了覆蓋的各種復雜性,盡管元類引入了自己的復雜性。__new__
但是為了解決您的問題,這段代碼已經(jīng)過時了,將參數(shù)傳遞給現(xiàn)在將拋出錯誤,而不是簡單地忽略。要完成這項工作,只需不要將任何參數(shù)傳遞給__new__
:object.__new__
In [1]: class Singleton(object):
...: _instance = None
...: def __new__(class_, *args, **kwargs):
...: if not isinstance(class_._instance, class_):
...: class_._instance = object.__new__(class_)
...: return class_._instance
...:
In [2]: class Test(Singleton):
...: def __init__(self, name=None):
...: print(name)
...:
...: test1 = Test('a')
a
注意,每次“實例化”單例時都會調(diào)用:__init__
In [3]: test2 = Test('b')
b
In [4]: test1 is test2
Out[4]: True
這可能是可取的,也可能是不可取的。
但是認真地重新考慮您是否需要單例課程。即使在有意義的語言中,例如Java,它們通常也是一種反模式,并且只是在OOP封裝的外觀中隱藏可變?nèi)譅顟B(tài)的一種方式。這再次使我想到了僅使用模塊的原始建議,那么您沒有任何借口。
添加回答
舉報