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__()
添加回答
举报