这可能有点晚了,但是我使用Python Meta-Classes(也是下面的装饰器版本)提出了一个解决方案。
什么时候 __init__
在运行时被调用时,它抓住每个参数和它们的值,并将它们分配为实例变量上您的课。这样,您可以制作类似结构的类,而不必手动分配每个值。
我的示例没有错误检查,因此更容易理解。
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
它在起作用。
>>> class MyClass(object):
__metaclass__ = MyStruct
def __init__(self, a, b, c):
pass
>>> my_instance = MyClass(1, 2, 3)
>>> my_instance.a
1
>>>
我将其发布在reddit上,/ u / matchu发布了一个更干净的装饰器版本。除非您要扩展元类版本,否则我建议您使用它。
>>> 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
>>>