2

我想定义一个字典,以便使用一些助记符调用一个函数,比如 run(),它调用类中的一个成员函数。所以我想出了以下内容:

class foo:
    dict = { 'f_func' : f, 'g_func': g }
    def f():
        pass
    def g():
        pass
    def run(self, n):
        # ... do something
        dict[n]()

现在的问题是 dict 中的值是尚未定义的成员函数。我怎样才能做到这一点?

或者任何其他解决方法?

4

1 回答 1

5

您稍后定义结构,在这种情况下在__init__方法中以确保您具有绑定方法:

class foo:
    def __init__(self):
        self.dict = { 'f_func' : self.f, 'g_func': self.g }
    def f(self):
        pass
    def g(self):
        pass
    def run(self, n):
        # ... do something
        self.dict[n]()

或者,按名称查找方法:

class foo:
    dict = { 'f_func' : 'f', 'g_func': 'g' }
    def f(self):
        pass
    def g(self):
        pass
    def run(self, n):
        # ... do something
        getattr(self, self.dict[n])()

类定义完成后,您始终可以更改类:

class foo:
    def f(self):
        pass
    def g(self):
        pass
    def run(self, n):
        # ... do something
        self.dict[n](self)

foo.dict = { 'f_func' : foo.f, 'g_func': foo.g }

但是它存储了未绑定的方法,迫使您self显式地传入。

最后,您可以将定义移动到定义和函数的dict位置:fg

class foo:
    def f(self):
        pass
    def g(self):
        pass

    dict = { 'f_func' : f, 'g_func': g }

    def run(self, n):
        # ... do something
        self.dict[n](self)

类体像函数一样执行,本地命名空间变成类属性。现在dict值是函数,与未绑定方法有同样的问题;你需要self明确地传入。(在 Python 3 中不再有未绑定的方法,这个解决方案和之前的解决方案是等价的)。

您可能希望避免使用dict作为属性名称,因为它可能会导致与内置dict类型混淆。

于 2013-04-16T10:39:31.500 回答