मेटाप्रोग्रामिंग शब्द उस कंप्यूटर प्रोग्रामिंग को संदर्भित करता है जहां कंप्यूटर प्रोग्राम स्वयं को हेरफेर करने या उसके बारे में ज्ञान रखने का प्रयास करते हैं। Python मेटाक्लास नामक एक नए प्रकार के क्लास के माध्यम से क्लास के लिए मेटाप्रोग्रामिंग का समर्थन करता है।
Python में मेटाक्लास के माध्यम से मेटा-प्रोग्रामिंग मौजूदा कोड को संशोधित, लपेटकर या उत्पन्न करके फ़ंक्शन और क्लास बनाने के लिए है।
मेटा-प्रोग्रामिंग की प्रमुख विशेषताएं हैं -
- मेटाक्लास
- डेकोरेटर
- क्लास-डेकोरेटर
मेटाक्लास क्या है
मेटाक्लास की एक बहुत सीमित परिभाषा हो सकती है, एक क्लास जो एक क्लास बनाती है। Python एक ऑब्जेक्ट-ओरिएंटेड भाषा है जहां सब कुछ एक ऑब्जेक्ट है और क्लास कोई अपवाद नहीं हैं। क्लास कीवर्ड के साथ एक क्लास को परिभाषित करते हुए, Python वास्तव में इसे निष्पादित करता है और फिर एक ऑब्जेक्ट उत्पन्न करता है। चूंकि यह एक ऑब्जेक्ट है, आप इसे निर्दिष्ट, कॉपी, विशेषताएं जोड़ सकते हैं, फ़ंक्शन पैरामीटर के रूप में उपयोग कर सकते हैं, और इसी तरह। मेटाक्लास का उपयोग करके हम क्लास के निर्माण को नियंत्रित कर सकते हैं, जैसे क्लास के गुणों को संशोधित करना, संपत्ति की वैधता की जांच करना, और इसी तरह।
Python बिल्ट-इन मेटाक्लास
सभी क्लास का मेटाक्लास type है
class a: pass print(type(a))
आउटपुट:
उपरोक्त आउटपुट से, हम देख सकते हैं कि "a" (क्लास) क्लास type का एक ऑब्जेक्ट है। हम यह भी कह सकते हैं कि "a" (क्लास) क्लास type का एक उदाहरण है। तो type एक मेटाक्लास है। तो Python में, हर क्लास बिल्ट-इन मेटाक्लास type से संबंधित है।

Python क्लास बनाने के लिए मेटाक्लास का उपयोग करना
जैसा कि हमने उपरोक्त उदाहरण में देखा, type डिफ़ॉल्ट मेटाक्लास है। हम इस डिफ़ॉल्ट मेटाक्लास (type) की मदद से एक नई क्लास बना सकते हैं।
>>> class hello(object): pass
इसे मैन्युअल रूप से इस तरह भी बनाया जा सकता है -
>>> hello = type('hello', (), {})
>>> print(hello) # एक क्लास ऑब्जेक्ट लौटाता है
>>> print(hello()) # क्लास के साथ एक उदाहरण बनाता है
<__main__.hello object at 0x05D86830>
Type क्लास के गुणों को परिभाषित करने के लिए एक डिक्शनरी स्वीकार करता है, इसलिए
>>> 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__ विशेषता
Python में, या तो हमारे पास एक क्लास है या उसके बेस में से एक में __metaclass__ विशेषता है, इसे मेटाक्लास के रूप में लिया जाता है अन्यथा type मेटाक्लास है। हम __metaclass__ विशेषता तब रख सकते हैं जब हम एक क्लास लिखते हैं जैसे -
तो क्या होता है जब हम परिभाषित करते हैं, एक क्लास जैसे -
class hello(object):
x = 10
उपरोक्त में, hello क्लास में कोई __metaclass__ विशेषता नहीं है, इसलिए type का उपयोग किया जाता है, और क्लास निर्माण इस प्रकार किया जाता है -
hello = type(name, bases, dict)
यदि हमारे hello में मेटाक्लास परिभाषित है -
class hello(object):
__metaclass__ = myMetaClass
pass
अब उपरोक्त उदाहरण में, क्लास निर्माण myMetaClass का उपयोग करके type के बजाय किया जाता है। Hello = myMetaClass(name, bases, dict)