यह थोड़ा देरी से हो सकता है लेकिन मैंने पायथन मेटा-क्लासेस (नीचे भी डेकोरेटर संस्करण) का उपयोग करके एक समाधान बनाया।
__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
>>>