मेटाक्लास

From Vigyanwiki

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में, एक मेटाक्लास एक क्लास (कंप्यूटर विज्ञान) है, जिसके उदाहरण क्लास हैं। जिस तरह एक साधारण वर्ग कुछ वस्तुओं के व्यवहार को परिभाषित करता है, उसी तरह एक मेटाक्लास कुछ वर्गों और उनके उदाहरणों के व्यवहार को परिभाषित करता है। सभी वस्तु-उन्मुख प्रोग्रामिंग भाषाएँ मेटाक्लास का समर्थन नहीं करती हैं। ऐसा करने वालों में, वर्ग व्यवहार के किसी दिए गए पहलू को मेटाक्लास किस सीमा तक ओवरराइड कर सकता है। प्रथम श्रेणी के नागरिक या प्रथम श्रेणी के नागरिक होने से मेटाक्लास को प्रयुक्त किया जा सकता है, इस स्थिति में एक मेटाक्लास केवल एक वस्तु है जो कक्षाओं का निर्माण करती है। प्रत्येक भाषा का अपना मेटाऑब्जेक्ट प्रोटोकॉल होता है, नियमों का एक सेट जो यह नियंत्रित करता है कि ऑब्जेक्ट, क्लासेस और मेटाक्लास कैसे इंटरैक्ट करते हैं।[1]


पायथन उदाहरण

पायथन (प्रोग्रामिंग लैंग्वेज) में, बिल्टिन क्लास type एक मेटाक्लास है।[2][3][4] इस साधारण पायथन वर्ग पर विचार करें:

class Car:
    def __init__(self, make: str, model: str, year: int, color: str):
        self.make = make
        self.model = model
        self.year = year
        self.color = color

    @property
    def description(self) -> str:
        """Return a description of this car."""
        return f"{self.color} {self.make} {self.model}"

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


उपरोक्त उदाहरण में चार विशेषताओं make, model, year, और color. से संबंधित कुछ अनावश्यक कोड सम्मिलित हैं। मेटाक्लास का उपयोग करके इस अतिरेक में से कुछ को समाप्त करना संभव है। पायथन में, मेटाक्लास को सबसे आसानी से typeके उपवर्ग के रूप में परिभाषित किया जाता है।

class AttributeInitType(type):
    def __call__(self, *args, **kwargs):
        """Create a new instance."""

        # First, create the object in the normal default way.
        obj = type.__call__(self, *args)

        # Additionally, set attributes on the new object.
        for name, value in kwargs.items():
            setattr(obj, name, value)

        # Return the new object.
        return obj


यह मेटाक्लास केवल ऑब्जेक्ट निर्माण को ओवरराइड करता है। वर्ग और वस्तु व्यवहार के अन्य सभी पहलुओं को अभी भी typeके आधार पर नियंत्रित किया जाता है।

अब इस मेटाक्लास का उपयोग करने के लिए क्लास Carको फिर से लिखा जा सकता है। पायथन 3 में यह क्लास परिभाषा में "कीवर्ड तर्क" metaclass प्रदान करके किया जाता है:

class Car(object, metaclass=AttributeInitType):
    @property
    def description(self) -> str:
        """Return a description of this car."""
        return " ".join(str(value) for value in self.__dict__.values())

परिणामी वस्तु Car सामान्य रूप से तत्काल किया जा सकता है, किंतु इसमें कई कीवर्ड तर्क सम्मिलित हो सकते हैं:

new_car = Car(make='Toyota', model='Prius', year=2005, color='Green', engine='Hybrid')

स्मॉलटाक -80 में

यूएमएल आरेख के रूप में स्मॉलटॉक-80 मेटाक्लास पदानुक्रम
स्मालटाक में वर्गों और मेटाक्लासेस के बीच इनहेरिटेंस और उदाहरण संबंधों का आरेख

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

उदाहरण के रूप से, एक Car ऑब्जेक्ट c क्लास Carका एक उदाहरण है। बदले में, क्लास Carफिर से एक ऑब्जेक्ट है और Carके मेटाक्लास का एक उदाहरण है जिसे Carclass कहा जाता है। मेटाक्लास के नाम में रिक्त स्थान पर ध्यान दें। मेटाक्लास का नाम स्मॉलटॉक एक्सप्रेशन है, जिसका मूल्यांकन करने पर मेटाक्लास ऑब्जेक्ट प्राप्त होता है। इस Car class वर्ग के मूल्यांकन से Car के लिए मेटाक्लास ऑब्जेक्ट प्राप्त होता है जिसका नाम Carclass है (कोई Car class nameका मूल्यांकन करके इसकी पुष्टि कर सकता है जो Carके मेटाक्लास का नाम लौटाता है।)

क्लास विधियाँ वास्तव में मेटाक्लास से संबंधित होती हैं, जैसे इंस्टेंस विधियाँ वास्तव में क्लास से संबंधित होती हैं। जब ऑब्जेक्ट पर एक संदेश भेजा जाता है, तो विधि की खोज Integerमें प्रारंभ होती है। यदि यह नहीं मिलता है तो यह सुपरक्लास श्रृंखला में आगे बढ़ता है, ऑब्जेक्ट पर रुकता है, चाहे वह पाया जाए या नहीं पाया जाता है।

जब कोई संदेश Integerको भेजा जाता है तो विधि की खोज Integer class में शुरू होती है और सुपरक्लास श्रृंखला से Object class. तक आगे बढ़ती है। ध्यान दें कि, अब तक, मेटाक्लास इनहेरिटेंस श्रृंखला बिल्कुल क्लास इनहेरिटेंस श्रृंखला का अनुसरण करती है। लेकिन मेटाक्लास श्रृंखला आगे बढ़ती है क्योंकि Object class. Class का उपवर्ग है। सभी मेटाक्लास क्लास के उपवर्ग हैं।

आरंभिक स्मॉलटाक में, केवल एक मेटाक्लास था जिसे Classकहा जाता था। इसका तात्पर्य यह था कि सभी वर्गों की विधियाँ समान थीं, विशेष रूप से नई वस्तुएँ बनाने की विधि, अर्थातnew। कक्षाओं को अपने स्वयं के विधि और अपने स्वयं के इंस्टेंस वेरिएबल्स (जिसे क्लास इंस्टेंस वेरिएबल्स कहा जाता है और इसे क्लास वेरिएबल्स के साथ भ्रमित नहीं किया जाना चाहिए) की अनुमति देने के लिए, स्मॉलटॉक -80 ने प्रत्येक क्लास C के लिए अपने स्वयं के मेटाक्लास C class की प्रारंभ की। इसका मतलब यह है कि प्रत्येक मेटाक्लास प्रभावी रूप से एक सिंगलटन क्लास है।

चूँकि ऐसी कोई आवश्यकता नहीं है कि मेटाक्लास एक-दूसरे से भिन्न व्यवहार करें, सभी मेटाक्लास केवल एक ही वर्ग के उदाहरण हैं जिन्हें मेटाक्लास कहा जाता है। Metaclass के Metaclassको Metaclass class कहा जाता है जो फिर से Metaclassक्लास का एक उदाहरण है।

स्मॉलटॉक-80 में, प्रत्येक वर्ग (Objectको छोड़कर) में एक सुपरक्लास होता है। सभी मेटाक्लास का अमूर्त सुपरक्लास Classहै, जो कक्षाओं की सामान्य प्रकृति का वर्णन करता है।

मेटाक्लास के लिए सुपरक्लास पदानुक्रम, क्लास Objectको छोड़कर, कक्षाओं के समान है। सभी मेटाक्लास Classके उपवर्ग हैं, इसलिए:

  • Object class superclass == Class.

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

मेटाक्लास पदानुक्रम में कक्षाओं के नाम समान नाम की अवधारणाओं से आसानी से भ्रमित हो जाते हैं। उदाहरण के लिए:

  • Object आधार वर्ग है जो सभी ऑब्जेक्ट के लिए सामान्य विधि प्रदान करता है; "एक वस्तु" एक पूर्णांक, या एक विजेट, या एक Car, आदि है।
  • Class मेटाक्लास का आधार है जो सभी वर्गों के लिए सामान्य तरीके प्रदान करता है (चूँकि यह स्वयं मेटाक्लास नहीं है); "एक वर्ग" Integer, या Widget, या Car इत्यादि जैसा कुछ है।
  • Metaclass सभी मेटाक्लास के लिए सामान्य विधि प्रदान करता है।

चार वर्ग नई कक्षाओं का वर्णन करने की सुविधा प्रदान करते हैं। उनकी विरासत पदानुक्रम (ऑब्जेक्ट से), और उनके द्वारा प्रदान की जाने वाली मुख्य सुविधाएं हैं:

ऑब्जेक्ट - सभी ऑब्जेक्ट्स के लिए सामान्य व्यवहार, जैसे क्लास एक्सेस
व्यवहार - संकलन विधियों और वस्तुओं को बनाने/चलाने के लिए न्यूनतम अवस्था(कंप्यूटर विज्ञान)
कक्षाविवरण (सार वर्ग) - वर्ग / चर नामकरण, टिप्पणियाँ
वर्ग - समान, अधिक व्यापक, सुपरक्लास की सुविधाएं
मेताक्लास - वर्ग चर प्रारंभ करना, उदाहरण निर्माण संदेश

रुबी में

रूबी ईजेनक्लासेस की प्रारंभिक करके, Metaclass क्लास को हटाकर, और (अन) मैप के क्लास को फिर से परिभाषित करके मेटाक्लास की स्मॉलटॉक-80 अवधारणा को शुद्ध करती है। परिवर्तन को निम्नानुसार योजनाबद्ध किया जा सकता है:[5]

Smalltalk-80
कक्षाओं
अंतर्निहितमेटाक्लासेस
  
टर्मिनल

वस्तुओं

Ruby
कक्षाओं
ईजेनक्लास काकक्षाओं
ईजेनक्लासेसका

ईजेनक्लास

टर्मिनल

वस्तुओं

ईजेनक्लास काटर्मिनल ऑब्जेक्ट

विशेष रूप से स्मॉलटाक के अंतर्निहित मेटाक्लासेस और रूबी के ईजेनक्लास ऑफ क्लासेस के बीच पत्राचार पर ध्यान दें। रूबी ईजेनक्लास मॉडल अंतर्निहित मेटाक्लास की अवधारणा को पूरी तरह से एक समान बनाता है: प्रत्येक वस्तु x का अपना मेटा-ऑब्जेक्ट होता है, जिसे x का ईजेनक्लास कहा जाता है, जो x से एक मेटा-स्तर अधिक होता है। उच्च क्रम के ईजेनक्लास सामान्यतः विशुद्ध रूप से वैचारिक रूप से उपस्थित होते हैं - अधिकांश रूबी कार्यक्रमों में उनमें कोई विधियाँ नहीं होती हैं या कोई (अन्य) डेटा संग्रहीत नहीं होता है।[6]

निम्नलिखित चित्र तुलना में स्मॉलटाक -80 और रूबी की एक नमूना कोर संरचना दिखाते हैं।[7] दोनों भाषाओं में, संरचना में एक अंतर्निहित भाग होता है जिसमें गोलाकार वस्तुएं होती हैं (अर्थात ऐसी वस्तुएं जो नीले या हरे रंग के लिंक के संयोजन से बने चक्र में दिखाई देती हैं) और एक उपयोगकर्ता-भाग जिसमें चार स्पष्ट वस्तुएं होती हैं: वर्ग A और Bऔर टर्मिनल ऑब्जेक्ट्स u और v.हरे रंग के लिंक बच्चे को दिखाते हैं → इनहेरिटेंस के माता-पिता के संबंध (अंतर्निहित ऊपर की दिशा के साथ), नीले लिंक पूरक सदस्य → तात्कालिकता के कंटेनर संबंध दिखाते हैं (x बिंदुओं से एक नीला लिंक x के कम से कम वास्तविक कंटेनर के लिए प्रारंभ बिंदु है विधि लुकअप जब एक्स पर एक विधि प्रयुक्त की जाती है)। ग्रे नोड्स ईजेनक्लास (स्मॉलटाक -80 के स्थिति में उत्तर निहित मेटाक्लासेस) प्रदर्शित करते हैं।

Smalltalk-80   Ruby
Implicit metaclasses in Smalltalk-80 - A sample structure Eigenclasses in Ruby - A sample structure


दाईं ओर का चित्र रूबी में ईजेनक्लासेस के आलसी मूल्यांकन की एक तस्वीर भी प्रदान करता है। v.में सिंगलटन विधियों को जोड़ने के परिणामस्वरूप v. ऑब्जेक्ट के ईजेनक्लास का मूल्यांकन (आवंटित) किया जा सकता है।

रूबी की classनाम की आत्मनिरीक्षण विधि के अनुसार, प्रत्येक वर्ग (और प्रत्येक ईजेनक्लास) का वर्ग लगातार classवर्ग होता है (आरेख में c द्वारा दर्शाया गया है)। classऔर Struct ही एकमात्र ऐसे वर्ग हैं जिनमें उदाहरण के रूप में वर्ग होते हैं।[8] वर्ग के उपवर्गीकरण की अनुमति नहीं है। मेटाक्लास की मानक परिभाषा के बाद हम यह निष्कर्ष निकाल सकते हैं कि रूबी में classऔर Struct ही एकमात्र मेटाक्लास हैं। यह रूबी और स्मॉलटॉक के बीच पत्राचार का खंडन करता प्रतीत होता है, क्योंकि स्मॉलटॉक-80 में, प्रत्येक वर्ग का अपना मेटाक्लास होता है। विसंगति रूबी और स्मॉलटॉक में वर्ग आत्मनिरीक्षण पद्धति के बीच असहमति पर आधारित है। जबकि मानचित्र x ↦ x.classटर्मिनल ऑब्जेक्ट्स पर मेल खाता है, यह कक्षाओं के प्रतिबंध में भिन्न है। जैसा कि ऊपर बताया गया है, classx के लिए, रूबी एक्सप्रेशन x.classलगातार classका मूल्यांकन करता है। स्मॉलटॉक-80 में, यदि x एक वर्ग है तो अभिव्यक्ति x class रूबी के x.singleton_class से मेल खाता है - जो x के ईजेनक्लास का मूल्यांकन करता है।

उद्देश्य-सी में

ऑब्जेक्टिव-सी में क्लासेस और मेटाक्लासेस के बीच इनहेरिटेंस और इंस्टेंस रिलेशनशिप का डायग्राम। ध्यान दें कि ऑब्जेक्टिव-सी में कई रूट क्लासेस हैं; प्रत्येक मूल वर्ग का एक अलग पदानुक्रम होगा। यह आरेख केवल एक उदाहरण रूट क्लास NSObject के लिए पदानुक्रम दिखाता है। एक दूसरे रूट क्लास में एक समान पदानुक्रम होगा।

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

स्मॉलटॉक की तरह, ऑब्जेक्टिव-सी में, क्लास विधियां केवल क्लास ऑब्जेक्ट पर कॉल की जाने वाली विधियां हैं, इसलिए क्लास की क्लास विधियों को इसके मेटाक्लास में इंस्टेंस विधियों के रूप में परिभाषित किया जाना चाहिए। क्योंकि अलग-अलग वर्गों में वर्ग विधियों के अलग-अलग सेट हो सकते हैं, प्रत्येक वर्ग का अपना अलग मेटाक्लास होना चाहिए। कक्षाएं और मेटाक्लास सदैव एक जोड़ी के रूप में बनाए जाते हैं: रनटाइम में क्रमशः क्लास-मेटाक्लास जोड़े बनाने और पंजीकृत करने के लिए objc_allocateClassPair()और objc_registerClassPair()फ़ंक्शन होते हैं।

मेटाक्लासेस के लिए कोई नाम नहीं हैं; चूँकि, किसी भी क्लास ऑब्जेक्ट के पॉइंटर को सामान्य प्रकार Class के साथ संदर्भित किया जा सकता है(प्रकार के समान id किसी ऑब्जेक्ट के पॉइंटर के लिए उपयोग किया जा रहा है)।

क्योंकि वर्ग विधियों को इनहेरिटेंस के माध्यम से विरासत में मिला है, जैसे कि स्मॉलटाक, मेटाक्लासेस को कक्षाओं के समानांतर एक विरासत योजना का पालन करना चाहिए (उदाहरण के लिए यदि क्लास A का मूल वर्ग वर्ग B है, तो A का मेटाक्लास का मूल वर्ग B का मेटाक्लास है), रूट वर्ग को छोड सकते है।

स्मॉलटाक के विपरीत, रूट क्लास का मेटाक्लास रूट क्लास (सामान्यतः NSObject कोको (एपीआई) रूपरेखा का उपयोग करके) यह सुनिश्चित करता है कि सभी क्लास ऑब्जेक्ट्स अंततः रूट क्लास के उदाहरण हैं, जिससे आप रूट क्लास के इंस्टेंस विधियों का उपयोग कर सकते है, सामान्यतः क्लास ऑब्जेक्ट पर ऑब्जेक्ट के लिए उपयोगी उपयोगिता विधियाँ होती हैं ।

चूँकि मेटाक्लास ऑब्जेक्ट्स अलग तरह से व्यवहार नहीं करते हैं (आप मेटाक्लास के लिए क्लास मेथड्स नहीं जोड़ सकते हैं, इसलिए मेटाक्लास ऑब्जेक्ट्स में सभी समान विधि हैं), वे सभी एक ही क्लास के उदाहरण हैं- रूट क्लास के मेटाक्लास (स्मॉलटाक के विपरीत) इस प्रकार, रूट क्लास का मेटाक्लास स्वयं का एक उदाहरण है। इसका कारण यह है कि सभी मेटाक्लास मूल वर्ग से प्राप्त होते हैं; इसलिए, उन्हें रूट क्लास के क्लास मेथड्स को इनहेरिट करना होगा।[9]


भाषाओं और उपकरणों में समर्थन

निम्नलिखित कुछ सबसे प्रमुख प्रोग्रामिंग लैंग्वेज हैं जो मेटाक्लासेस को सपोर्ट करती हैं।

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

संसाधन विवरण रूपरेखा (आरडीएफ) और एकीकृत मॉडलिंग भाषा (यूएमएल) दोनों मेटाक्लासेस को सपोर्ट करते हैं।

यह भी देखें

संदर्भ

  1. Ira R. Forman and Scott Danforth (1999). मेटाक्लासेस को काम में लाना. ISBN 0-201-43305-2.
  2. IBM Metaclass programming in Python, parts 1 Archived 2008-09-03 at the Wayback Machine, 2 and 3
  3. Artima Forum: Metaclasses in Python 3.0 (part 1 of 2) (part 2 of 2)
  4. David Mertz. "पायथन मेटाक्लास प्रोग्रामिंग पर एक प्राइमर". ONLamp. Archived from the original on April 30, 2003. Retrieved June 28, 2006.
  5. "The Ruby Object Model: Comparison with Smalltalk-80".
  6. Paolo Perrotta (2010). Metaprogramming Ruby. Pragmatic Bookshelf. ISBN 978-1-934356-47-0.
  7. "Object Membership: The Core Structure of Object Technology".
  8. "struct". Ruby Doc. Retrieved 1 May 2015.
  9. Cocoa with Love: What is a meta-class in Objective-C?
  10. Herb Sutter. "मेटाक्लासेस" (PDF).
  11. "मेटाक्लासेस का उपयोग करके जावा में मिक्सिन्स का कार्यान्वयन" (PDF). Archived from the original (PDF) on 2007-10-16. Retrieved 2007-11-27.