2 回答

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊
您可以將它們添加到構(gòu)造函數(shù)中,如下所示:
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貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊
為了引用類內(nèi)部實(shí)現(xiàn)的方法,需要以下語法:
METHODS_MAP =
{
'a': MyClass.a,
'b': MyClass.b
}
因?yàn)橛行┖瘮?shù)作用于類實(shí)例而不是@classmethods,所以我們需要更改caller()函數(shù):
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)
如果所需的函數(shù)不是@classmethod,self將傳遞給它。否則,它將像往常一樣被調(diào)用
重要提示:雖然這個(gè)解決方案看起來比MEHTODS_MAP在__init__()函數(shù)內(nèi)初始化字典更復(fù)雜,但它的成本要低得多。使用此方法,該類擁有的實(shí)例數(shù)量不會(huì)影響在內(nèi)存中創(chuàng)建的次數(shù)METHODS_MAP(始終只有一個(gè))。
使用此處建議的其他方法(使用),將不必要地創(chuàng)建副本__init__()的每個(gè)實(shí)例,因?yàn)樗窃诤瘮?shù)內(nèi)部初始化的MyClass()METHODS_MAP__init__()
添加回答
舉報(bào)