এই বিট কোডটি আপনাকে গতিশীল নাম এবং পরামিতি নাম সহ নতুন ক্লাস তৈরি করতে দেয়। __init__
কেবলমাত্র প্যারামিটার যাচাইকরণ অজানা প্যারামিটারগুলিকে মঞ্জুরি দেয় না, যদি আপনার অন্যান্য ধরণের যেমন ভেরিফিকেশন প্রয়োজন হয় বা সেগুলি বাধ্যতামূলক হয় তবে কেবল যুক্তি যুক্ত করুন:
class BaseClass(object):
def __init__(self, classtype):
self._type = classtype
def ClassFactory(name, argnames, BaseClass=BaseClass):
def __init__(self, **kwargs):
for key, value in kwargs.items():
if key not in argnames:
raise TypeError("Argument %s not valid for %s"
% (key, self.__class__.__name__))
setattr(self, key, value)
BaseClass.__init__(self, name[:-len("Class")])
newclass = type(name, (BaseClass,),{"__init__": __init__})
return newclass
এবং এটি এর মতো কাজ করে, উদাহরণস্বরূপ:
>>> SpecialClass = ClassFactory("SpecialClass", "a b c".split())
>>> s = SpecialClass(a=2)
>>> s.a
2
>>> s2 = SpecialClass(d=3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __init__
TypeError: Argument d not valid for SpecialClass
আমি দেখতে পাচ্ছি যে আপনি নামকরণের সুযোগে ডায়নামিক নামগুলি সন্নিবেশ করানোর জন্য জিজ্ঞাসা করছেন - এখন, এটি পাইথনের একটি ভাল অভ্যাস হিসাবে বিবেচিত হয় না - আপনার হয় ভেরিয়েবলের নাম, কোডিংয়ের সময় বা ডেটা - এবং রানটাইমের সময় শিখে নেওয়া নামগুলি বেশি " "ভেরিয়েবল" এর চেয়ে ডেটা -
সুতরাং, আপনি কেবল একটি ক্লাসে আপনার ক্লাস যুক্ত করতে এবং সেখান থেকে তাদের ব্যবহার করতে পারেন:
name = "SpecialClass"
classes = {}
classes[name] = ClassFactory(name, params)
instance = classes[name](...)
এবং যদি আপনার ডিজাইনের নামগুলি সুযোগে আসার জন্য একেবারে প্রয়োজন হয় তবে কেবল একই কাজ করুন তবে globals()
একটি স্বেচ্ছাসেবক অভিধানের পরিবর্তে কল দিয়ে ফিরে আসা অভিধানটি ব্যবহার করুন:
name = "SpecialClass"
globals()[name] = ClassFactory(name, params)
instance = SpecialClass(...)
(ক্লাস ফ্যাক্টরির কার্যক্রমে কলারের বিশ্বব্যাপী নামটি সন্নিবেশ করা সম্ভব ছিল - তবে এটি আরও খারাপ অনুশীলন, এবং পাইথন বাস্তবায়ন জুড়ে এটি উপযুক্ত নয় that এটি করার উপায়টি কলারের পেতে হবে এক্সিকিউশন ফ্রেম, sys._getframe (1) এর মাধ্যমে এবং ফ্রেমের গ্লোবাল অভিধানে শ্রেণীর নামটি তার f_globals
বৈশিষ্ট্যে সেট করে)।
আপডেট, টিএল; ডাঃ: এই উত্তরটি জনপ্রিয় হয়ে উঠেছে, এখনও এটি প্রশ্নবোধের সাথে খুব নির্দিষ্ট।
পাইথনে "বেস ক্লাস থেকে উদ্ভূত শ্রেণিগুলি কীভাবে গতিশীলভাবে তৈরি করা যায় " সম্পর্কে সাধারণ উত্তরটি
type
নতুন শ্রেণীর নাম, বেসক্লাস (এস) সহ একটি টুপল এবং __dict__
নতুন বর্গের মতো শরীরকে পাস করার জন্য একটি সহজ কল call এটির মত:
>>> new_class = type("NewClassName", (BaseClass,), {"new_method": lambda self: ...})
আপডেট
যার যার প্রয়োজন এটি ডিল প্রকল্পটিও পরীক্ষা করে দেখা উচিত - এটি দাবি করে যে আচার সাধারণ বস্তুগুলির মতোই আচার এবং আনপিক ক্লাস করতে সক্ষম হবে এবং আমার কয়েকটি পরীক্ষায় এটি বেঁচে ছিল।
a
এটি দিয়ে থাকি তবে এটি সর্বদা থাকবেMyClass
এবংTestClass
কখনই গ্রহণ করবে নাa
? কেন কেবলমাত্র 3 টি আর্গুমেন্টকে ঘোষনা না করে সেগুলিতেBaseClass.__init__()
ডিফল্ট করা হয়None
?def __init__(self, a=None, b=None, C=None)
?