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

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


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

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

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

  • मेटाक्लास
  • सजावटी
  • कक्षा-सज्जाकार

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

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

पायथन बिल्ट-इन मेटाक्लास

सभी वर्गों का मेटाक्लास प्रकार है

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 (नाम, आधार, तानाशाही)


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

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

  1. पायथन में विरासत

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

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

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