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

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

你可以在 python 類的 __init__ 中使用靜態(tài)方法作為默認(rèn)參數(shù)嗎?

你可以在 python 類的 __init__ 中使用靜態(tài)方法作為默認(rèn)參數(shù)嗎?

九州編程 2021-10-26 16:47:26
我正在為神經(jīng)網(wǎng)絡(luò)編寫(xiě)一個(gè)類,我想對(duì)其進(jìn)行某種形式的定制,以便您可以選擇不同的成本函數(shù)和正則化。為此,我想將它們?cè)O(shè)置為_(kāi)_init__()方法中的默認(rèn)參數(shù)。但是當(dāng)我傳入MyClass.static_method我的示例時(shí),解釋器會(huì)告訴我 MyClass 還沒(méi)有(還)定義。為什么會(huì)這樣,是否有比我更好的解決方法?您當(dāng)然可以將靜態(tài)方法設(shè)置為默認(rèn)參數(shù),但隨后會(huì)出現(xiàn)其他問(wèn)題。例如,如果我想訪問(wèn)函數(shù)名稱(我真正想要的),我不能立即使用__name__。我知道如何通過(guò)訪問(wèn)static_method.__func__.__name__. 但這似乎很笨拙,并且當(dāng)您獲得一個(gè)靜態(tài)方法對(duì)象時(shí),似乎不打算以這種方式使用它。class MyClass:    @staticmethod    def static_method():        do_something()    def __init__(self, func=MyClass.static_method, func2=static_method):        self.name = func.__name__                  #Does not work        self.name2 = func2.__func__.__name__       #Should work我確實(shí)希望MyClass.static_method工作,但該類當(dāng)時(shí)似乎不存在。那么,最后一次,為什么?
查看完整描述

2 回答

?
holdtom

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊

您在將靜態(tài)方法用作默認(rèn)參數(shù)時(shí)遇到問(wèn)題的原因是兩個(gè)問(wèn)題的組合。


第一個(gè)問(wèn)題是,在def語(yǔ)句運(yùn)行時(shí)需要很好地定義默認(rèn)參數(shù),而不僅僅是在調(diào)用函數(shù)時(shí)。那是因?yàn)槟J(rèn)參數(shù)被內(nèi)置到函數(shù)對(duì)象中,而不是在每次函數(shù)運(yùn)行時(shí)重新計(jì)算(這也是為什么像空列表這樣的可變默認(rèn)參數(shù)通常是錯(cuò)誤的原因)。無(wú)論如何,這就是您不能MyClass.static_method用作默認(rèn)參數(shù)的原因,因?yàn)镸yClass在定義函數(shù)時(shí)尚未定義(類對(duì)象僅在其所有內(nèi)容都已創(chuàng)建后生成)。


下一個(gè)問(wèn)題是staticmethod對(duì)象不具有與常規(guī)函數(shù)相同的屬性和方法。通常這無(wú)關(guān)緊要,因?yàn)楫?dāng)您通過(guò)類對(duì)象(例如,MyClass.static_method一旦MyClass存在)或通過(guò)實(shí)例(例如self.static_method)訪問(wèn)它時(shí),它將是可調(diào)用的并且具有__name__. 但那是因?yàn)槟谶@些情況下獲得了底層功能,而不是staticmethod對(duì)象本身。該staticmethod對(duì)象本身是一個(gè)描述符,而不是調(diào)用。


所以這兩個(gè)函數(shù)都不能正常工作:


class MyClass:

    @staticmethod

    def static_method():

        pass


    def foo(self, func=MyClass.static_method): # won't work because MyClass doesn't exist yet

        pass


    def bar(self, func=static_method): # this declaration will work (if you comment out foo)

        name = func.__name__  # but this doesn't work when the bar() is called

        func()                # nor this, as func is the staticmethod object

什么工作將使用staticmethod對(duì)象底層的實(shí)際函數(shù)作為默認(rèn)值:


    def baz(self, func=static_method.__func__):  # this works!

        name = func.__name__

        func()

與使用name = func.__func__.__name__.


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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