이것은 약간 늦을 수도 있지만 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
>>>