第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python Singleton表現(xiàn)怪異

Python Singleton表現(xiàn)怪異

達令說 2023-10-11 21:11:18
我想創(chuàng)建一個python單例類,以便在程序打開后代碼中的其他任何地方調(diào)用該類時,該類的實例完全相同。我試圖找到單例示例,并從鏈接中找到了一個:https://wikidocs.net/3693class Singleton(object):    _instance = None    def __new__(class_, *args, **kwargs):        if not isinstance(class_._instance, class_):            class_._instance = object.__new__(class_, *args, **kwargs)        return class_._instance然后像這樣測試class Test(Singleton):    def __init__(self, name=None):        print(name)test1 = Test('a')期望顯示初始化時給出的名稱 但這給了我一個錯誤TypeError                                 Traceback (most recent call last)<ipython-input-55-f3383e846037> in <module>()----> 1 test1 = Test('a')<ipython-input-33-222ac7a13884> in __new__(class_, *args, **kwargs)     27     def __new__(class_, *args, **kwargs):     28         if not isinstance(class_._instance, class_):---> 29             class_._instance = object.__new__(class_, *args, **kwargs)     30         return class_._instanceTypeError: object() takes no parameters但是當我嘗試這個時,這個成功了Test() # with no prarametertest1 = Test('a') # this prints 'a' without error我想知道如何解決這個問題。否則,當我啟動程序時,我必須在開始時初始化不帶參數(shù)。我想獲取參數(shù)的原因是,當參數(shù)在某個時候更改時,我想將更改的信息應用于調(diào)用此類的所有位置。
查看完整描述

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)的一種方式。這再次使我想到了僅使用模塊的原始建議,那么您沒有任何借口。


查看完整回答
反對 回復 2023-10-11
  • 1 回答
  • 0 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號