এই বিট কোডটি আপনাকে গতিশীল নাম এবং পরামিতি নাম সহ নতুন ক্লাস তৈরি করতে দেয়। __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)?