替代多个构造函数

时间:2016-04-01 19:35:26

标签: python architecture

我有一个类有这样的构造函数:

class MyClass:
    def __init__(self, options):
        self.options = options
    .....

有时我通过传递options来启动此类的实例,例如:

parser = argparse.ArgumentParser(description='something')
parser.add_argument('-v', '--victor', dest='vic')
options = parser.parse_args()
x = MyClass(options)

这样可以正常工作,但是,有些情况下会没有选项传递,所以对于这些场景,我在MyClass中创建了一个方法,它将创建这样的默认选项。

class MyClass:
    def __init__(self, options):
        self.options = options

    def create_default_parser(self):
        parser = argparse.ArgumentParser(description='something')
        parser.add_argument('-v', '--victor', dest='vic', default="winning")
        options = parser.parse_args()
        self.options = options   

问题

当我不想传递任何options并使用create_default_parser时,我该如何启动此类的实例? 理想情况下,我会创建另一个不接受任何参数的构造函数,在该构造函数中我会调用create_default_parser,如下所示:

def __init__(self):
    self.create_default_parser()

2 个答案:

答案 0 :(得分:2)

您可以使用带有默认值的关键字参数。

class MyClass:
    def __init__(self, options=None):
        if options is not None:
            self.options = options
        else:
            self.create_default_parser()

然后可以使用

调用它
MyClass(options)

MyClass()  # calls create_default_parser()

答案 1 :(得分:2)

有几种方法可以做到这样的事情。一种方法是让选项具有一个默认值,表示您想要默认值。这看起来像这样:

class MyClass:
    def __init__(self, options=None):
        if options is None:
            options = create_default_parser()
        self.options = options

    def create_default_parser(self):
        parser = argparse.ArgumentParser(description='something')
        parser.add_argument('-v', '--victor', dest='vic', default="winning")
        options = parser.parse_args()
        return options

初始化默认值看起来像

default = MyClass()

另一种方法是使用这样的类方法:

class MyClass:
    def __init__(self, options):
        self.options = options

    @classmethod
    def create_default_parser(cls):
        parser = argparse.ArgumentParser(description='something')
        parser.add_argument('-v', '--victor', dest='vic', default="winning")
        options = parser.parse_args()
        return cls(options)

,默认设置如下:

default = MyClass.create_default_parser()