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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Python Singleton表現(xiàn)怪異

Python Singleton表現(xiàn)怪異

達(dá)令說 2023-10-11 21:11:18
我想創(chuàng)建一個(gè)python單例類,以便在程序打開后代碼中的其他任何地方調(diào)用該類時(shí),該類的實(shí)例完全相同。我試圖找到單例示例,并從鏈接中找到了一個(gè):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然后像這樣測(cè)試class Test(Singleton):    def __init__(self, name=None):        print(name)test1 = Test('a')期望顯示初始化時(shí)給出的名稱 但這給了我一個(gè)錯(cuò)誤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但是當(dāng)我嘗試這個(gè)時(shí),這個(gè)成功了Test() # with no prarametertest1 = Test('a') # this prints 'a' without error我想知道如何解決這個(gè)問題。否則,當(dāng)我啟動(dòng)程序時(shí),我必須在開始時(shí)初始化不帶參數(shù)。我想獲取參數(shù)的原因是,當(dāng)參數(shù)在某個(gè)時(shí)候更改時(shí),我想將更改的信息應(yīng)用于調(diào)用此類的所有位置。
查看完整描述

1 回答

?
炎炎設(shè)計(jì)

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


查看完整回答
反對(duì) 回復(fù) 2023-10-11
  • 1 回答
  • 0 關(guān)注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)