【问题标题】:alternate for multiple constructors替代多个构造函数
【发布时间】:2016-04-02 03:45:34
【问题描述】:

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

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

【问题讨论】:

    标签: python architecture


    【解决方案1】:

    您可以通过多种方式执行此类操作。一种方法是让选项具有默认值,表明您需要默认值。这可能如下所示:

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

    【讨论】:

    • 默认会在不传递参数的情况下创建。
    • zondo 说了什么。否则使用classmethod 作为工厂是一个不错的选择。
    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 2015-09-09
      • 1970-01-01
      • 2021-05-07
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      相关资源
      最近更新 更多