将参数传递给 Class:在定义期间或在 python3 的构造函数中解包?

Passing arguments into the Class: unpacking during definition or in the constructor in python3?

我是 OOP 的新手,正在编写 main.py。通过传递许多不同的参数从 CLI 调用。

请帮我使用更好的解决方案来解压值?

解决方案 #1:在 class 定义期间解压参数或解决方案 #2:在 init 构造函数中解压参数。

解决方案#1

def unpack_command_line(vars):
      if len(vals) == 3:
          return dictinary_of_some_values1
      elif len(vals) > 4:
          return dictinary_of_some_values2
      else:
          raise ValueError("Some arguments are missing")


def main(argv):
      cli_vars = unpack_command_line(argv)
      if cli_vars['action'] == 'some_command':
           sc = SomeClass(cli_vars['param1'], cli_vars['param'])
           sc.domesomething()
      if cli_vars['action'] == 'some_command2':
           .........
      else:
           raise ValueError("Wrong arguments")

if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))

然后我打电话给 class

class SomeCLass():

    def __init__(self, param1, param2, param3):
        self.param1 = param1
        self.param2 = param2

解决方案#2

def unpack_command_line(vars):
      if len(vals) == 3:
          return dictinary_of_some_values1
      elif len(vals) > 4:
          return dictinary_of_some_values2
      else:
          raise ValueError("Some arguments are missing")


def main(argv):
      cli_vars = unpack_command_line(argv) 
      if cli_vars['action'] == 'some_command': 
           sc = SomeClass(cli_vars)  # Here is the difference 1
           sc.domesomething()
      if cli_vars['action'] == 'some_command2':
         .......
      else:
           raise ValueError("Wrong arguments")

if __name__ == '__main__':
    sys.exit(main(sys.argv[1:]))

然后我打电话给 class

class SomeCLass():

    def __init__(self, dict_cli_vars):   # Here is the difference 2
        self.param1 = dict_cli_vars['param1']  # Here is the difference 3
        self.param2 = dict_cli_vars['param2']

稍后 在构造函数中解包是更好的方法。您可以解压缩 cli_vars 词典的内容。

sc = SomeClass(**cli_vars)


class SomeCLass():

    def __init__(self, **kwargs):   # Here is the difference 2
        for key, val in kwargs.items():
            setattr(self, key, val)