Как сделать класс инициализируемым с помощью позиционных и ключевых аргументов

Я пытаюсь создать класс, который позволяет инициализировать либо значениями по умолчанию для аргументов, либо передаваемыми ему значениями. Кроме того, я хочу иметь возможность передавать эти аргументы как позиционные или как ключевые. Однако он работает с аргументами с ключевыми словами, когда я пытаюсь создать его как foo = Foo(3) с любым количеством позиционных аргументов, если я получаю TypeError: __init__() takes 1 positional argument but 2 were given

class Foo:
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        args_list = OrderedDict()
        args_list.update(x=1,
                        y=2,
                        z=3)
        args_list.update(kwargs)

        iter_args_list = enumerate(args_list)
        for positional_arg in args:
            (_, key_value) = next(iter_args_list)
            args_list[key_value] = positional_arg

        for argument_key, argument_value in args_list.items():
          setattr(self, argument_key, argument_value)

1 ответ

Решение

Проблема, вероятно, в том, что вы передаете args а также kwargs к super() а также object не нравится, так как object не принимает (именованные или безымянные) параметры. Поэтому вы должны переписать:

class Foo:
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # ...

чтобы:

class Foo:
    def __init__(self, *args, **kwargs):
        super().__init__()
        # ...
Другие вопросы по тегам