এটি কিছুটা দেরিতে হতে পারে তবে আমি পাইথন মেটা-ক্লাসগুলি (নীচে সজ্জা সংস্করণ) ব্যবহার করে একটি সমাধান করেছি।
__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 / ম্যাচু একটি সজ্জা সংস্করণ পোস্ট করেছেন যা পরিষ্কার er আপনি যদি মেটাক্লাস সংস্করণটি প্রসারিত না করতে চান তবে আমি এটি ব্যবহার করতে উত্সাহিত করব।
>>> 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
>>>