1 回答

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