替代多个构造函数

alternate for multiple constructors

我有一个 class 有这样一个构造函数:

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

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

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 时,我应该如何启动此 class 的实例? 理想情况下,我会制作另一个不接受任何参数的构造函数,并在该构造函数中调用 create_default_parser,如下所示:

def __init__(self):
    self.create_default_parser()

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

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()

您可以通过多种方式完成类似的操作。一种方法是让选项具有默认值,表明您需要默认值。这可能看起来像这样:

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 方法:

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()