我在一个类中有这个方法:
def do_exit():
# some task
我想为 do_exit 分配一些其他方法,所以目前我正在这样做:
do_quit = do_exit
do_stop = do_exit
do_finish = do_exit
do_complete = do_exit
do_leave = do_exit
这很好用,但我想知道是否有更好的方法,特别是如果我要经常这样做的话。
请您参考如下方法:
您可能会考虑制作一本字典来保存您的方法。使用 defaultdict,您可以确保 do_exit 在没有为特定函数名称插入任何其他内容的情况下被调用。另一方面,这可能不是很安全或无法验证,例如拼写错误:
from collections import defaultdict
method_dict = defaultdict(lambda: do_exit)
# Try this
method_dict["do_quit"]()
在一个类中,您也可以根据需要覆盖 __getattr__。比如说,只是猜测,所有这些类型的方法都以 do 开头,或者条件可能是它们以 complete 的某个同义词结尾。您可以为该类提供一个类属性,该属性包含适当的约定项并检查它们,并根据需要在 method_dict 中查找它们。
from collections import defaultdict
class Foo(object):
QUIT_WORDS = ['exit', 'quit', 'stop', 'finish', 'complete', 'leave']
def __init__(self):
self.method_dict = defaultdict(lambda: self.do_exit)
def __getattr__(self, attr):
if any([attr.endswith("_{}".format(x)) for x in self.QUIT_WORDS]):
return self.method_dict[attr]
else:
return super(Foo, self).__getattribute__(attr)
def do_exit(self):
print "Exit!"
例如:
In [88]: f = Foo()
In [89]: f.do_quit()
Exit!
In [90]: f.do_exit()
Exit!
In [91]: f.do_go_bye_bye()
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-91-2584940dee36> in <module>()
----> 1 f.do_go_bye_bye()
<ipython-input-87-3b0db0bf6a47> in __getattr__(self, attr)
11 return self.method_dict[attr]
12 else:
---> 13 return super(Foo, self).__getattribute__(attr)
14
15
