Как сделать класс инициализируемым с помощью позиционных и ключевых аргументов
Я пытаюсь создать класс, который позволяет инициализировать либо значениями по умолчанию для аргументов, либо передаваемыми ему значениями. Кроме того, я хочу иметь возможность передавать эти аргументы как позиционные или как ключевые. Однако он работает с аргументами с ключевыми словами, когда я пытаюсь создать его как 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__()
# ...