亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

你可以在 python 類的 __init__ 中使用靜態方法作為默認參數嗎?

你可以在 python 類的 __init__ 中使用靜態方法作為默認參數嗎?

九州編程 2021-10-26 16:47:26
我正在為神經網絡編寫一個類,我想對其進行某種形式的定制,以便您可以選擇不同的成本函數和正則化。為此,我想將它們設置為__init__()方法中的默認參數。但是當我傳入MyClass.static_method我的示例時,解釋器會告訴我 MyClass 還沒有(還)定義。為什么會這樣,是否有比我更好的解決方法?您當然可以將靜態方法設置為默認參數,但隨后會出現其他問題。例如,如果我想訪問函數名稱(我真正想要的),我不能立即使用__name__。我知道如何通過訪問static_method.__func__.__name__. 但這似乎很笨拙,并且當您獲得一個靜態方法對象時,似乎不打算以這種方式使用它。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我確實希望MyClass.static_method工作,但該類當時似乎不存在。那么,最后一次,為什么?
查看完整描述

2 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

您在將靜態方法用作默認參數時遇到問題的原因是兩個問題的組合。


第一個問題是,在def語句運行時需要很好地定義默認參數,而不僅僅是在調用函數時。那是因為默認參數被內置到函數對象中,而不是在每次函數運行時重新計算(這也是為什么像空列表這樣的可變默認參數通常是錯誤的原因)。無論如何,這就是您不能MyClass.static_method用作默認參數的原因,因為MyClass在定義函數時尚未定義(類對象僅在其所有內容都已創建后生成)。


下一個問題是staticmethod對象不具有與常規函數相同的屬性和方法。通常這無關緊要,因為當您通過類對象(例如,MyClass.static_method一旦MyClass存在)或通過實例(例如self.static_method)訪問它時,它將是可調用的并且具有__name__. 但那是因為您在這些情況下獲得了底層功能,而不是staticmethod對象本身。該staticmethod對象本身是一個描述符,而不是調用。


所以這兩個函數都不能正常工作:


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對象底層的實際函數作為默認值:


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

        name = func.__name__

        func()

與使用name = func.__func__.__name__.


查看完整回答
反對 回復 2021-10-26
  • 2 回答
  • 0 關注
  • 323 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號