Вы, вероятно, можете сделать это с метаклассами.Вот пример метакласса, который переопределяет __init__()
: Python Class Decorator
Конечно, вам нужно будет как-то указать имена полей / аргументов - или использовать именованные аргументы, если вы предпочитаете,Вот один из способов сделать это:
# This is the mataclass-defined __init__
def auto_init(self, *args, **kwargs):
for arg_val, arg_name in zip(args, self.init_args):
setattr(self, arg_name, arg_val)
# This would allow the user to explicitly specify field values with named arguments
self.__dict__.update(kwargs)
class MetaBase(type):
def __new__(cls, name, bases, attrs):
attrs['__init__'] = auto_init
return super(MetaBase, cls).__new__(cls, name, bases, attrs)
class Base(object):
__metaclass__ = MetaBase
# No need to define __init__
class Foo(Base):
init_args = ['first', 'last', 'email', 'mi']