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)

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__()
添加回答
舉報