Dies mag etwas spät sein, aber ich habe eine Lösung mit Python Meta-Classes (Dekorator-Version unten auch) erstellt.
Wann __init__
es zur Laufzeit aufgerufen wird, erfasst es jedes der Argumente und ihren Wert und weist sie Ihrer Klasse als Instanzvariablen zu. Auf diese Weise können Sie eine strukturähnliche Klasse erstellen, ohne jeden Wert manuell zuweisen zu müssen.
In meinem Beispiel gibt es keine Fehlerprüfung, daher ist es einfacher zu folgen.
class MyStruct(type):
def __call__(cls, *args, **kwargs):
names = cls.__init__.func_code.co_varnames[1:]
self = type.__call__(cls, *args, **kwargs)
for name, value in zip(names, args):
setattr(self , name, value)
for name, value in kwargs.iteritems():
setattr(self , name, value)
return self
Hier ist es in Aktion.
>>> class MyClass(object):
__metaclass__ = MyStruct
def __init__(self, a, b, c):
pass
>>> my_instance = MyClass(1, 2, 3)
>>> my_instance.a
1
>>>
Ich habe es auf reddit gepostet und / u / matchu hat eine Dekorationsversion gepostet, die sauberer ist. Ich würde Sie ermutigen, es zu verwenden, es sei denn, Sie möchten die Metaklassenversion erweitern.
>>> def init_all_args(fn):
@wraps(fn)
def wrapped_init(self, *args, **kwargs):
names = fn.func_code.co_varnames[1:]
for name, value in zip(names, args):
setattr(self, name, value)
for name, value in kwargs.iteritems():
setattr(self, name, value)
return wrapped_init
>>> class Test(object):
@init_all_args
def __init__(self, a, b):
pass
>>> a = Test(1, 2)
>>> a.a
1
>>>