2016-04-01 3 views
0

у меня есть класс, который имеет конструктор так:чередуются для нескольких конструкторов

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

Есть несколько способов, которые вы можете сделать что-то вроде этого. Один из способов состоял бы в том, чтобы параметры имели значение по умолчанию, которое указывает, что вы хотите по умолчанию. Это может выглядеть следующим образом:

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

Значение по умолчанию будет создано без передачи аргумента. – zondo

+0

Что зодо сказал. В противном случае использование 'classmethod' в качестве фабрики - приятный штрих. –

+0

Хороший улов, спасибо – Jules

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() 
Смежные вопросы