您稍后定义结构,在这种情况下在__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
位置:f
g
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
类型混淆。