Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Python

Python में मेटाक्लास के साथ मेटाप्रोग्रामिंग


मेटाप्रोग्रामिंग शब्द उस कंप्यूटर प्रोग्रामिंग को संदर्भित करता है जहां कंप्यूटर प्रोग्राम स्वयं को हेरफेर करने या उसके बारे में ज्ञान रखने का प्रयास करते हैं। Python मेटाक्लास नामक एक नए प्रकार के क्लास के माध्यम से क्लास के लिए मेटाप्रोग्रामिंग का समर्थन करता है।

Python में मेटाक्लास के माध्यम से मेटा-प्रोग्रामिंग मौजूदा कोड को संशोधित, लपेटकर या उत्पन्न करके फ़ंक्शन और क्लास बनाने के लिए है।

मेटा-प्रोग्रामिंग की प्रमुख विशेषताएं हैं -

  • मेटाक्लास
  • डेकोरेटर
  • क्लास-डेकोरेटर

मेटाक्लास क्या है

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

Python बिल्ट-इन मेटाक्लास

सभी क्लास का मेटाक्लास type है

class a: pass
print(type(a))

आउटपुट:

उपरोक्त आउटपुट से, हम देख सकते हैं कि "a" (क्लास) क्लास type का एक ऑब्जेक्ट है। हम यह भी कह सकते हैं कि "a" (क्लास) क्लास type का एक उदाहरण है। तो type एक मेटाक्लास है। तो Python में, हर क्लास बिल्ट-इन मेटाक्लास type से संबंधित है।

Python में मेटाक्लास के साथ मेटाप्रोग्रामिंग

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)


  1. पायथन में ट्किंटर प्रोग्रामिंग पायथन में ट्किंटर प्रोग्रामिंग

    ट्किंटर पायथन के लिए मानक GUI लाइब्रेरी है। ट्किंटर के साथ संयुक्त पायथन GUI एप्लिकेशन बनाने का एक तेज़ और आसान तरीका प्रदान करता है। ट्किंटर Tk GUI टूलकिट के लिए एक शक्तिशाली ऑब्जेक्ट-ओरिएंटेड इंटरफ़ेस प्रदान करता है।ट्किंटर का उपयोग करके GUI एप्लिकेशन बनाना एक आसान कार्य है। आपको बस निम्नलिखित चरण

  1. पायथन में इनहेरिटेंस (Inheritance) पायथन में इनहेरिटेंस (Inheritance)

    इस लेख में, हम पायथन 3.x या उससे पहले के संस्करण में इनहेरिटेंस और क्लासेस को एक्सटेंड करने के बारे में जानेंगे।इनहेरिटेंस वास्तविक दुनिया के संबंधों को अच्छी तरह से दर्शाता है, पुन: प्रयोज्यता प्रदान करता है और ट्रांजिटिविटी का समर्थन करता है। यह तेज़ विकास समय, आसान रखरखाव और विस्तार में आसानी प्र

  1. पायथन में टर्टल प्रोग्रामिंग पायथन में टर्टल प्रोग्रामिंग

    टर्टल पायथन की एक विशेष विशेषता है। टर्टल का उपयोग करके, हम आसानी से एक ड्राइंग बोर्ड पर ड्रा कर सकते हैं। पहले हम टर्टल मॉड्यूल इम्पोर्ट करते हैं। फिर एक विंडो बनाते हैं, अगला हम टर्टल ऑब्जेक्ट बनाते हैं और टर्टल मेथड का उपयोग करके ड्राइंग बोर्ड पर ड्रा कर सकते हैं। कुछ टर्टल मेथड मेथडपैरामीटरविव