如何用父方法修饰(包装)子方法

2024-04-25 07:57:33 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,这个问题可能是duplicate,但不知怎么的,我对这些问题的答案还不太清楚。假设我有:

import argparse
class Parent:
    def __init__(self):
        self.parser = argparse.ArgumentParser()

        self.parser.add_argument("user")
        # parse the argument
        self.parser.parse_args()

class Child(Parent):
    def __init__(self):
        # here self.parser is not defined
        # self.parser.add_argument("password")
        super().__init__()
        # here args are already parsed and 
        # self.parser does not include args
        # self.parser.add_argument("password")
if __name__ == '__main__':

    Child()

这是我想编写的代码的最小工作示例(类似于命令行app framework)。我的设置基本如下

^{pr2}$

在我的例子中有一个简单的局部解决方法。当Parent可能不self.parser.parse_args()或者它将以某种方式检查(不知道现在如何写)是否child添加了任何参数,然后将self.parser.parse_args()留给子类。但我想,是否可能有一个愚蠢的想法是改变父母的__init__的行为像一个装饰者而不是孩子,并做这样的事情(这是事实的一部分,即init允许返回None之外的任何内容,这可能由于其他各种原因而不起作用…)在

class Child(Parent):
    @super.__init__
    def __init__(self):

所以,有什么想法,我应该选择哪条道路?我的动机是,我希望最终用户,谁将使用这样的框架(这意味着编写应用程序,继承自父级)需要做尽可能少的工作(这意味着,将大多数东西转移到父级)。有什么合理的方法,怎么做?在


Tags: selfaddchildparserhereparseinitdef
1条回答
网友
1楼 · 发布于 2024-04-25 07:57:33

将父类中的“中间”部分移到单独的方法中。然后,您可以在子对象中重写该方法:

class Parent:
    def __init__(self):
        self._construct_parser()
        # parse the argument
        self.parser.parse_args()

    def _construct_parser(self):
        self.parser = argparse.ArgumentParser()    
        self.parser.add_argument("user")

class Child(Parent):
    def _construct_parser(self):
        super()._construct_parser()
        # add on to self.parser

这实际上是另一个问题至少有一个答案告诉您要做的事情:将父级__init__中的各个部分拆分成单独的方法,每个方法都可以单独重写。在

如果您要将此作为一个框架,那么添加特定的钩子也是一种选择。父类定义它在特定点调用的空方法,子类可以实现这些方法来参与特定的步骤。这里是ArgumentParser类的构造位置,子类可以添加到其中:

^{pr2}$

现在,子类甚至不必再使用super();它得到了所有它需要的东西,由框架预先消化,以更新解析器。在

相关问题 更多 >