Bu biraz geç olabilir ama ben Python Meta-Sınıfları (aşağıda dekoratör sürümü de) kullanarak bir çözüm yaptı.
Ne zaman __init__
çalışma zamanı sırasında denir, bu argümanlar ve bunların değeri ve sınıfınıza örnek değişkenleri olarak atar onları her yakalar. Bu şekilde, her değeri manuel olarak atamak zorunda kalmadan yapı benzeri bir sınıf oluşturabilirsiniz.
Örneğimde hata denetimi yok, bu yüzden takip etmek daha kolay.
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
İşte burada.
>>> class MyClass(object):
__metaclass__ = MyStruct
def __init__(self, a, b, c):
pass
>>> my_instance = MyClass(1, 2, 3)
>>> my_instance.a
1
>>>
Ben reddit ve / u / matchu yayınlanmıştır temiz olan bir dekoratör sürümü yayınladı. Metaclass versiyonunu genişletmek istemiyorsanız onu kullanmanızı tavsiye ederim.
>>> 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
>>>