指向Python类和方法的指针
我想要一个函数指针字典,这个字典可以指向不同的类方法。有什么好的方法来实现这个吗?
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的funca()或者objectb的funcb()。
有没有办法把self.O1放进“命令映射”里呢?
2 个回答
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)
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()