Skip to main content
 首页 » 编程设计

python之将多种方法设置为等于另一种方法的优雅方式

2025年05月04日10lori

我在一个类中有这个方法:

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