Вы можете использовать *args
и **kwargs
, но в целом в вашем исходном подходе нет ничего плохого. Пожалуйста, обратитесь к этой статье, которая довольно хорошо объясняет функциональность *args
и **kwargs
https://www.digitalocean.com/community/tutorials/how-to-use-args-and-kwargs-in-python-3
EDIT: вполне нормально использовать *args
и *kwargs
в init, и он неплохо работает с наследованием. Рассмотрим следующий пример:
class Foo:
def __init__(self,foo=None,bar=None,*args,**kwargs):
self.foo = foo
self.bar = bar
class Bar(Foo):
def __init__(self, required, optional = None, *args, **kwargs):
self.required = required
self.optional = optional
self.barkwarg = kwargs.get('barkwarg')
super().__init__(*args,**kwargs)
if __name__ == "__main__":
bar1 = Bar(0,1,2,3,4)
bar2 = Bar(0,1,barkwarg=2,foo=3,bar=4)
если вы распечатаете атрибуты, вы увидите, что аргументы были распакованы и переданы базовому классу.
print("bar1.required: ",bar1.required) # required: 0
print("bar1.optional: ",bar1.optional) # optional: 1
print("bar1.barkwarg: ",bar1.barkwarg) # barkwarg: None
print("bar1.foo: ",bar1.foo) # foo: 2
print("bar1.bar: ",bar1.bar) # bar: 3
print("bar2.required: ",bar2.required) # required: 0
print("bar2.optional: ",bar2.optional) # optional: 1
print("bar2.barkwarg: ",bar2.barkwarg) # barkwarg: 2
print("bar2.foo: ",bar2.foo) # foo: 2
print("bar2.bar: ",bar2.bar) # bar: 3
Вам также не нужно if
при работе с kwargs
, но вы можете использовать метод dictionary.get(keyname, value)
, поскольку kwargs
- это просто словарь.