首先,这个问题可能是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):
所以,有什么想法,我应该选择哪条道路?我的动机是,我希望最终用户,谁将使用这样的框架(这意味着编写应用程序,继承自父级)需要做尽可能少的工作(这意味着,将大多数东西转移到父级)。有什么合理的方法,怎么做?在
将父类中的“中间”部分移到单独的方法中。然后,您可以在子对象中重写该方法:
这实际上是另一个问题至少有一个答案告诉您要做的事情:将父级
__init__
中的各个部分拆分成单独的方法,每个方法都可以单独重写。在如果您要将此作为一个框架,那么添加特定的钩子也是一种选择。父类定义它在特定点调用的空方法,子类可以实现这些方法来参与特定的步骤。这里是
^{pr2}$ArgumentParser
类的构造位置,子类可以添加到其中:现在,子类甚至不必再使用
super()
;它得到了所有它需要的东西,由框架预先消化,以更新解析器。在相关问题 更多 >
编程相关推荐