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

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

如何在類中使用 dict 作為 switch 語句

如何在類中使用 dict 作為 switch 語句

眼眸繁星 2023-09-12 18:26:44
我試圖在 python 類中使用 dict 作為 switch 語句,如下所示:class MyClass:    METHODS_MAP = {}  # I want to place map here    # some code here    def caller(self, instructions):        methods_map = {            "a": self.a,            "b": self.b        }        for key, value in instructions.items():            methods_map[key](value)    def a(self, val):        print("Called a")    def b(self, val):        print("Called b")a = MyClass()instr = {"b": 12, "a": 14}a.caller(instr)現在它工作得很好,但我需要將methods_map方法定義放置在與靜態變量相同的級別,正如有些人可能會說的那樣。我試過這個:class MyClass:    METHODS_MAP = {        "a": self.a   }或者class MyClass:    METHODS_MAP = {        "a": a   }但無論哪種方式,它都不知道類方法。我怎樣才能讓它按照我的方式工作?
查看完整描述

2 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

您可以將它們添加到構造函數中,如下所示:


class MyClass:

    def __init__(self):

        self.methods_map = {

            "a": self.a,

            "b": self.b

        }


    def caller(self, instructions):

        for key, value in instructions.items():

            self.methods_map[key](value)


    def a(self, val):

        print("Called a")


    def b(self, val):

        print("Called b")



x = MyClass()

instr = {"b": 12, "a": 14}

x.caller(instr)


查看完整回答
反對 回復 2023-09-12
?
浮云間

TA貢獻1829條經驗 獲得超4個贊

為了引用類內部實現的方法,需要以下語法:


METHODS_MAP = 

{

    'a': MyClass.a,

    'b': MyClass.b

}

因為有些函數作用于類實例而不是@classmethods,所以我們需要更改caller()函數:


from inspect import ismethod


def caller(self, instructions):

    for key, value in instructions.items():

        if METHODS_MAP[key].__self__ is MyClass: # check if function is class method

            METHODS_MAP[key](MyClass, value)

        elif ismethod(METHODS_MAP[key]): # check if method is an instance method

            METHODS_MAP[key](self, value)

        else: # static method

            METHODS_MAP[key](value)

如果所需的函數不是@classmethod,self將傳遞給它。否則,它將像往常一樣被調用


重要提示:雖然這個解決方案看起來比MEHTODS_MAP在__init__()函數內初始化字典更復雜,但它的成本要低得多。使用此方法,該類擁有的實例數量不會影響在內存中創建的次數METHODS_MAP(始終只有一個)。


使用此處建議的其他方法(使用),將不必要地創建副本__init__()的每個實例,因為它是在函數內部初始化的MyClass()METHODS_MAP__init__()


查看完整回答
反對 回復 2023-09-12
  • 2 回答
  • 0 關注
  • 130 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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