Я пытаюсь внедрить конструктор, т.е. __init__
через суперкласс, чтобы избежать шаблонного кода в __init__
во всех моих классах домена.
Например:
class Structure:
_fields = []
def __init__(self, *args):
if len(args) != len(self._fields):
raise TypeError("Wrong # arguments")
for name, value in zip(self._fields, args):
setattr(self, name, value)
class Stock(Structure):
_fields = ['name', 'shares', 'price']
stock = Stock("Amzn", "11", "2100")
print(stock.name)
Приведенный выше код прекрасно работает, когда конструктор ограничен *args
.Но есть некоторые доменные классы, которые тоже принимают **kwargs
.
Например, что-то вроде ниже:
class Structure:
_fields = []
def __init__(self, *args, **kwargs):
if (len(args) + len(kwargs)) != len(self._fields):
raise TypeError("Wrong # arguments")
for name, value in zip(self._fields, args):
setattr(self, name, value)
class Stock(Structure):
_fields = ['name', 'shares', 'price']
stock = Stock("Amzn", "11", price = "2100")
stock.price #AttributeError, stock object has no attribute 'price'
Но очевидно, что приведенный выше код не установит kwargs, потому что я никогда не касался kwargs в __init__
.Любая идея, как я могу это исправить?