मेटाप्रोग्रामिंग शब्द कंप्यूटर प्रोग्रामिंग को संदर्भित करता है जहां कंप्यूटर प्रोग्राम हेरफेर करने की कोशिश करते हैं या स्वयं का ज्ञान रखते हैं। पायथन मेटाक्लास नामक एक नए प्रकार के वर्ग के माध्यम से कक्षाओं के लिए मेटाप्रोग्रामिंग का समर्थन करता है।
पायथन में मेटाक्लास के माध्यम से मेटा-प्रोग्रामिंग उन कार्यों और वर्गों का निर्माण करना है जो मौजूदा कोड को संशोधित, लपेटकर या उत्पन्न करके कोड में हेरफेर करते हैं।
मेटा-प्रोग्रामिंग की प्रमुख विशेषताएं हैं -
- मेटाक्लास
- सजावटी
- कक्षा-सज्जाकार
मेटाक्लास क्या है
मेटाक्लास की एक बहुत ही सीमित परिभाषा हो सकती है, एक वर्ग जो एक वर्ग बनाता है। पायथन एक वस्तु-उन्मुख भाषा है जहाँ सब कुछ एक वस्तु है और कक्षाएं कोई अपवाद नहीं हैं। क्लास कीवर्ड के साथ क्लास को परिभाषित करते हुए, पायथन वास्तव में इसे निष्पादित करता है और फिर एक ऑब्जेक्ट उत्पन्न करता है। चूंकि यह एक ऑब्जेक्ट है, आप फ़ंक्शन पैरामीटर के रूप में असाइन कर सकते हैं, कॉपी कर सकते हैं, विशेषताएँ जोड़ सकते हैं, और इसी तरह। मेटाक्लास का उपयोग करने से हम कक्षाओं की पीढ़ी को नियंत्रित कर सकते हैं, जैसे कि किसी वर्ग के गुणों को संशोधित करना, संपत्ति की वैधता की जाँच करना, और इसी तरह।
पायथन बिल्ट-इन मेटाक्लास
सभी वर्गों का मेटाक्लास प्रकार है
class a: pass print(type(a))
आउटपुट:
<class 'type'>
उपरोक्त आउटपुट से, हम देख सकते हैं कि "ए" (क्लास) क्लास टाइप की एक वस्तु है। हम यह भी कह सकते हैं कि "ए" (वर्ग) वर्ग प्रकार का एक उदाहरण है। तो टाइप एक मेटाक्लास है। तो अजगर में, प्रत्येक वर्ग अंतर्निहित मेटाक्लास प्रकार से संबंधित है।
पायथन वर्ग बनाने के लिए मेटाक्लास का उपयोग करना
जैसा कि हमने उपरोक्त उदाहरण में देखा, प्रकार डिफ़ॉल्ट मेटाक्लास है। हम इस डिफ़ॉल्ट मेटाक्लास (प्रकार) की मदद से एक नया वर्ग बना सकते हैं।
>>> class hello(object): pass
मैन्युअल रूप से इस तरह भी बनाया जा सकता है -
>>> hello = type('hello', (), {}) >>> print(hello)# returns a class object >>> print(hello()) # creates an instance with the class <__main__.hello object at 0x05D86830>. पर
प्रकार वर्ग की विशेषताओं को परिभाषित करने के लिए एक शब्दकोश स्वीकार करता है, इसलिए
>>> class hello(object): world = True
उपरोक्त कोड,
. के समान हैhello = type('hello', (), {'world' : True})
मेटाक्लास बनाएं
तो मेटाक्लास कब बनाएं? जब मैं किसी वर्ग के निर्माण को नियंत्रित करना चाहता हूं, जैसे किसी वर्ग के गुणों को सत्यापित या संशोधित करना।
कक्षा की तात्कालिकता प्रक्रिया -
- __new__() पर कॉल करके एक उदाहरण बनाएं
- ऊपर बनाए गए इंस्टेंस को इनिशियलाइज़ करने के लिए __init__() पर कॉल करें
इसलिए जब हम एक कस्टम मेटाक्लास बनाते हैं, तो हम वास्तव में मूल वर्ग की __new__() या __init__ पद्धति को बदल देते हैं।
उदाहरण1 - मेटाक्लास जिसने वर्ग के गुणों को संशोधित किया
class LowercaseMeta(type): def __new__(mcs, name, bases, attrs): lower_attrs = {} for k, v in attrs.items(): if not k.startswith('__'): lower_attrs[k.lower()] = v else: lower_attrs[k] = v return type.__new__(mcs, name, bases, lower_attrs) class LowercaseClass(metaclass=LowercaseMeta): BAR = True def HELLO(self): print('hello') print(dir(LowercaseClass)) LowercaseClass().hello()
आउटपुट
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bar', 'hello'] hello
उदाहरण2 - कक्षा में एक अतिरिक्त विशेषता जोड़ें
class ListMeta(type): def __new__(mcs, name, bases, attrs): attrs['add'] = lambda self, value: self.append(value) return type.__new__(mcs, name, bases, attrs) class MyList(list, metaclass=ListMeta): pass l = MyList() l.add(1) print(l) def class_decorator(cls): cls.add = lambda self, value: self.append(value) return cls @class_decorator class MyList(list): pass l = MyList() l.append(1) print(l)
आउटपुट
[1] [1]
__metaclass__ विशेषता
पायथन में, या तो हमारे पास एक वर्ग है या इसके आधारों में से एक में __metaclass__ जिम्मेदार है, इसे मेटाक्लास के रूप में लिया जाता है अन्य प्रकार मेटाक्लास है। जब हम किसी वर्ग को −
. के रूप में लिखते हैं तो हमारे पास __metaclass__ विशेषता हो सकती हैतो क्या होता है जब हम परिभाषित करते हैं, एक वर्ग जैसे -
class hello(object): x = 10
ऊपर में, हैलो क्लास में कोई __metaclass__ विशेषता नहीं है, इसलिए इसके बजाय प्रकार का उपयोग किया जाता है, और वर्ग निर्माण इस प्रकार किया जाता है -
hello = type(name, bases, dict)
यदि हमारे हैलो में एक मेटाक्लास परिभाषित है -
class hello(object): __metaclass__ = myMetaClass pass
अब उपरोक्त उदाहरण में, वर्ग निर्माण प्रकार के बजाय myMetaClass का उपयोग करके किया जाता है। हैलो =myMetaClass (नाम, आधार, तानाशाही)