指向Python类和方法的指针

0 投票
2 回答
529 浏览
提问于 2025-04-18 03:54

我想要一个函数指针字典,这个字典可以指向不同的类方法。有什么好的方法来实现这个吗?

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()

撰写回答