อาจจะช้าไปหน่อย แต่ฉันก็แก้ปัญหาโดยใช้ 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โพสต์เวอร์ชันมัณฑนากรซึ่งสะอาดกว่า ฉันขอแนะนำให้คุณใช้มันหากคุณไม่ต้องการขยายรุ่น metaclass
>>> 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
>>>