我想定义一个字典,以便一个函数,比如run(),用一些助记符调用,它调用类中的一个成员函数.所以我想出了以下内容:
class foo:
dict = { 'f_func' : f, 'g_func': g }
def f():
pass
def g():
pass
def run(self, n):
# ... do something
dict[n]()
Run Code Online (Sandbox Code Playgroud)
现在的问题是dict中的值是尚未定义的成员函数.我怎样才能做到这一点?
或者任何其他解决方法?
您可以在以后定义结构,在这种情况下,在__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]()
Run Code Online (Sandbox Code Playgroud)
或者,按名称查找方法:
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])()
Run Code Online (Sandbox Code Playgroud)
在类定义完成后,您始终可以更改类:
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 }
Run Code Online (Sandbox Code Playgroud)
但是存储了未绑定的方法,强制您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)
Run Code Online (Sandbox Code Playgroud)
类主体像函数一样执行,本地名称空间变为类属性.现在dict值是函数,与未绑定方法的问题相同; 你需要self明确传入.(在Python 3中,没有任何未绑定的方法,此解决方案和之前的方法是等效的).
您可能希望避免使用dict作为属性名称,因为它可能会导致与内置dict类型混淆.