指向Python类和方法的指针

时间:2014-04-23 10:56:42

标签: python pointers

我想有一个指向不同类方法的函数指针字典。这样做的最佳方法是什么?

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放入"命令图"?

2 个答案:

答案 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)