【发布时间】:2016-09-18 12:19:23
【问题描述】:
首先,这个问题可能是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()
这是我要编写的代码的最小工作示例(类似于命令行应用程序框架。我的设置基本上如下
class Parent:
def __init__(self):
# do some stuff starting stuff
# middle
# do some ending stuff
class Child(Parent):
def __init__(self):
# do something in the middle of Parent init
在我的情况下,有一个简单的部分解决方法。当Parent 可能不会做self.parser.parse_args() 或者它会以某种方式(现在不知道如何准确地写)检查,如果孩子添加了任何参数,然后将self.parser.parse_args() 留给孩子类。但我想,是否有可能一个愚蠢的想法是改变父母的__init__ 表现得像孩子的装饰者并做这样的事情(事实的一部分, init 确实允许返回除了None 之外的任何东西,它可能由于各种其他原因无法正常工作..?)
class Child(Parent):
@super.__init__
def __init__(self):
那么,有什么想法,我应该选择哪条路?我这样做的动机是,我希望最终用户,他们将使用这样的 framework(这意味着编写应用程序,继承自 Parent)需要做尽可能少的工作(这意味着,移动大多数事情都进入了父级)。有什么合理的方法,怎么做?
【问题讨论】:
-
如果所有功能都在
__init__中,你为什么要为此使用一个类?您是否考虑过拆分设置和解析,所以您的最后一行将是例如Child().parse()? -
@jonrsharpe 这只是一个开始,我想进一步扩展它。
标签: python class decorator argparse super