我想有一个指向不同类方法的函数指针字典。这样做的最佳方法是什么?
class A():
command_map = {
"call func1 of object1": ("1", func1)
"call func1 of object2": ("2", func1)
}
def __init__(self, object1, object2):
self.O1 = object1
self.O2 = object2
def call(self, cmd):
t = self.command_map[cmd]
target = t[0]
func = t[1]
if target == "1":
resp = self.O1.func()
elif target == "2":
resp = self.O2.func()
else:
self._logger.warn("Unknown target %r\n" % target)
在这种情况下,eclipse突出显示func变量,表示它未被使用。那你怎么办?我想根据一些输入值调用对象的objecta或funcb()的funca()。
有没有办法将self.O1放入"命令图"?
答案 0 :(得分:0)
更改您的command_map
以保留功能名称,而不是实际的'指针'。
command_map = {
'call func1 of object1': ('1', 'func1'),
'call func1 of object2': ('2', 'func1'),
}
然后您可以像这样定义call
方法:
def call(self, cmd):
t = A.command_map[cmd] # command_map is a class attribute, not an instance attribute
if t[0] == '1':
o = self.O1
elif:
o = self.O2
else:
self._logger.warn("Unknown target %r\n" % target)
return
f = getattr(o, t[1]) # get the method
f()
答案 1 :(得分:0)
您应该存储方法名称而不是引用。然后,您可以使用指定对象中的getattr
检索它。
class A():
command_map = {
"call func1 of object1": ("O1", 'func1_name')
"call func1 of object2": ("O2", 'func1_name')
}
def __init__(self, object1, object2):
self.O1 = object1
self.O2 = object2
def call(self, cmd):
target_name, method_name = self.command_map[cmd]
target_object = getattr(self, target_name, None)
if target_object is not None:
method = getattr(target_object, method_name, None)
if method is not None and callable(method):
return method()
else:
self._logger.warn("Unknown target %r\n" % target)