मेटाक्लास
ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में, एक मेटाक्लास एक कक्षा (कंप्यूटर विज्ञान) है, जिसके उदाहरण क्लास हैं। जिस तरह एक साधारण वर्ग कुछ वस्तुओं के व्यवहार को परिभाषित करता है, उसी तरह एक मेटाक्लास कुछ वर्गों और उनके उदाहरणों के व्यवहार को परिभाषित करता है। सभी वस्तु-उन्मुख प्रोग्रामिंग भाषाएँ मेटाक्लास का समर्थन नहीं करती हैं। ऐसा करने वालों में, वर्ग व्यवहार के किसी दिए गए पहलू को मेटाक्लास किस सीमा तक ओवरराइड कर सकता है। प्रथम श्रेणी के नागरिक या प्रथम श्रेणी के नागरिक होने से मेटाक्लास को प्रयुक्त किया जा सकता है, इस स्थिति में एक मेटाक्लास केवल एक वस्तु है जो कक्षाओं का निर्माण करती है। प्रत्येक भाषा का अपना मेटाऑब्जेक्ट प्रोटोकॉल होता है, नियमों का एक सेट जो यह नियंत्रित करता है कि ऑब्जेक्ट, क्लासेस और मेटाक्लास कैसे इंटरैक्ट करते हैं।[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 में
स्मॉलटाक में, सब कुछ एक वस्तु (कंप्यूटर विज्ञान) है। इसके अतिरिक्त, स्मॉलटाक एक कक्षा आधारित प्रोग्रामिंग सिस्टम है, जिसका अर्थ है कि प्रत्येक वस्तु में एक वर्ग होता है जो उस वस्तु की संरचना को परिभाषित करता है (अर्थात वस्तु के उदाहरण चर) और संदेश एक वस्तु को समझता है। साथ में इसका तात्पर्य है कि स्मॉलटाक में एक वर्ग एक वस्तु है और इसलिए एक वर्ग को एक वर्ग (मेटाक्लास कहा जाता है) का एक उदाहरण होना चाहिए।
उदाहरण के तौर पर, एक कार वस्तु c वर्ग का उदाहरण है Car. बदले में, वर्ग Car फिर से एक वस्तु है और इस तरह के मेटाक्लास का एक उदाहरण है Car बुलाया Car class. मेटाक्लास के नाम पर रिक्त स्थान पर ध्यान दें। मेटाक्लास का नाम स्मॉलटाक एक्सप्रेशन है, जिसका मूल्यांकन करने पर, मेटाक्लास ऑब्जेक्ट में परिणाम होता है। इस प्रकार मूल्यांकन Car class के लिए मेटाक्लास ऑब्जेक्ट में परिणाम Car जिसका नाम है Car class (कोई मूल्यांकन करके इसकी पुष्टि कर सकता है Car class name जो के मेटाक्लास का नाम लौटाता है Car.)
वर्ग विधि तरीके वास्तव में मेटाक्लास से संबंधित होते हैं, जैसे उदाहरण के तरीके वास्तव में क्लास के होते हैं। जब वस्तु को संदेश भेजा जाता है 2, में विधि की खोज शुरू होती है 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सभी मेटाक्लास के लिए सामान्य तरीके प्रदान करता है।
चार वर्ग नई कक्षाओं का वर्णन करने की सुविधा प्रदान करते हैं। उनकी विरासत पदानुक्रम (ऑब्जेक्ट से), और उनके द्वारा प्रदान की जाने वाली मुख्य सुविधाएं हैं:
- ऑब्जेक्ट - सभी ऑब्जेक्ट्स के लिए सामान्य व्यवहार, जैसे क्लास एक्सेस
- व्यवहार - संकलन विधियों और वस्तुओं को बनाने/चलाने के लिए न्यूनतम राज्य (कंप्यूटर विज्ञान)।
- ClassDescription (सार वर्ग) - वर्ग / चर नामकरण, टिप्पणियाँ
- वर्ग - समान, अधिक व्यापक, सुपरक्लास की सुविधाएं
- Metaclass - वर्ग चर प्रारंभ करना, उदाहरण निर्माण संदेश
- ClassDescription (सार वर्ग) - वर्ग / चर नामकरण, टिप्पणियाँ
- व्यवहार - संकलन विधियों और वस्तुओं को बनाने/चलाने के लिए न्यूनतम राज्य (कंप्यूटर विज्ञान)।
रुबी में
रूबी ने विक्षनरी: eigenclasses,
हटा रहा है Metaclass कक्षा,
और (अन) मानचित्र के वर्ग को पुनर्परिभाषित करना।
परिवर्तन को निम्नानुसार योजनाबद्ध किया जा सकता है:[5]
|
→ |
|
विशेष रूप से स्मॉलटाक के अंतर्निहित मेटाक्लासेस और रूबी के ईजेनक्लास ऑफ क्लासेस के बीच पत्राचार पर ध्यान दें।
रूबी eigenclass मॉडल अंतर्निहित मेटाक्लास की अवधारणा को पूरी तरह से एक समान बनाता है: प्रत्येक वस्तु x का अपना मेटा-ऑब्जेक्ट होता है, जिसे x का eigenclass कहा जाता है, जो x से एक मेटा-स्तर अधिक होता है। उच्च क्रम के eigenclasses आमतौर पर विशुद्ध रूप से वैचारिक रूप से मौजूद होते हैं - अधिकांश रूबी कार्यक्रमों में उनमें कोई विधियाँ नहीं होती हैं या कोई (अन्य) डेटा संग्रहीत नहीं होता है।[6]
निम्नलिखित चित्र तुलना में स्मॉलटाक -80 और रूबी की एक नमूना कोर संरचना दिखाते हैं।[7]
दोनों भाषाओं में, संरचना में एक अंतर्निहित भाग होता है जिसमें गोलाकार वस्तुएं होती हैं (अर्थात ऐसी वस्तुएं जो नीले या हरे रंग के लिंक के संयोजन से बने चक्र में दिखाई देती हैं) और एक उपयोगकर्ता-भाग जिसमें चार स्पष्ट वस्तुएं होती हैं: वर्ग A और B
और टर्मिनल ऑब्जेक्ट्स u और v.
हरे रंग के लिंक बच्चे को दिखाते हैं → वंशानुक्रम के माता-पिता के संबंध (अंतर्निहित ऊपर की दिशा के साथ), नीले लिंक पूरक सदस्य → तात्कालिकता के कंटेनर संबंध दिखाते हैं (x बिंदुओं से एक नीला लिंक x के कम से कम वास्तविक कंटेनर के लिए प्रारंभ बिंदु है विधि लुकअप जब एक्स पर एक विधि प्रयुक्त की जाती है)। ग्रे नोड्स eigenclasses (स्मॉलटाक -80 के स्थिति में उत्तर निहित मेटाक्लासेस) प्रदर्शित करते हैं।
| Smalltalk-80 | Ruby | |
| Implicit metaclasses in Smalltalk-80 - A sample structure | Eigenclasses in Ruby - A sample structure |
दाईं ओर का आरेख रूबी में ईजेनक्लास के आलसी मूल्यांकन की एक तस्वीर भी प्रदान करता है। v ई> ऑब्जेक्ट में सिंगलटन विधियों को जोड़ने के परिणामस्वरूप इसका ईजेनक्लास मूल्यांकन (आवंटित) हो सकता है v.
रूबी के आत्मनिरीक्षण विधि के अनुसार नामित class,
प्रत्येक वर्ग का वर्ग (और प्रत्येक eigenclass का) है
लगातार Class वर्ग (द्वारा चिह्नित c आरेख में)।
Class, और Struct वे एकमात्र वर्ग हैं जिनके उदाहरण के रूप में कक्षाएं हैं।[8][disputed ] का उपवर्गीकरण Class अस्वीकृत है।
मेटाक्लासेस की मानक परिभाषा के बाद हम यह निष्कर्ष निकाल सकते हैं Class और Struct रूबी में एकमात्र मेटाक्लास हैं।
ऐसा लगता है कि रूबी और स्मॉलटाक के बीच पत्राचार का खंडन करता है,
चूंकि स्मॉलटॉक-80 में, प्रत्येक वर्ग का अपना मेटाक्लास होता है।
विसंगति के बीच असहमति पर आधारित है
classरूबी और स्मॉलटाक में आत्मनिरीक्षण विधि। जबकि नक्शा x ↦ x.classटर्मिनल ऑब्जेक्ट्स पर मेल खाता है, यह कक्षाओं के प्रतिबंध में भिन्न है। जैसा ऊपर बताया गया है, कक्षा के लिएx, रूबी अभिव्यक्तिx.classके लिए लगातार मूल्यांकन करता हैClass. स्मॉलटाक -80 में, अगरxएक वर्ग है तो अभिव्यक्तिx classमेल खाती है
रूबी के लिए x.singleton_class
- जो के eigenclass का मूल्यांकन करता है x.
== उद्देश्य-सी == में
ऑब्जेक्टिव-सी में मेटाक्लास लगभग स्मॉलटाक -80 के समान हैं-आश्चर्य की बात नहीं है क्योंकि ऑब्जेक्टिव-सी स्मॉलटाक से बहुत कुछ उधार लेता है। स्मॉलटाक की तरह, ऑब्जेक्टिव-सी में, उदाहरण चर और विधियों को ऑब्जेक्ट की कक्षा द्वारा परिभाषित किया जाता है। एक वर्ग एक वस्तु है, इसलिए यह मेटाक्लास का एक उदाहरण है।
स्मॉलटाक की तरह, ऑब्जेक्टिव-सी में, क्लास मेथड्स केवल क्लास ऑब्जेक्ट पर कॉल की जाने वाली मेथड्स हैं, इसलिए क्लास के क्लास मेथड्स को इसके मेटाक्लास में इंस्टेंस मेथड्स के रूप में परिभाषित किया जाना चाहिए। क्योंकि अलग-अलग वर्गों में वर्ग विधियों के अलग-अलग सेट हो सकते हैं, प्रत्येक वर्ग का अपना अलग मेटाक्लास होना चाहिए। कक्षाएं और मेटाक्लास हमेशा एक जोड़ी के रूप में बनाए जाते हैं: रनटाइम में कार्य होते हैं objc_allocateClassPair() और objc_registerClassPair() क्रमशः वर्ग-मेटाक्लास जोड़े बनाने और पंजीकृत करने के लिए।
मेटाक्लासेस के लिए कोई नाम नहीं हैं; हालाँकि, किसी भी वर्ग वस्तु के सूचक को सामान्य प्रकार के साथ संदर्भित किया जा सकता है Class (प्रकार के समान id किसी ऑब्जेक्ट के पॉइंटर के लिए इस्तेमाल किया जा रहा है)।
क्योंकि वर्ग विधियों को वंशानुक्रम के माध्यम से विरासत में मिला है, जैसे कि स्मॉलटाक, मेटाक्लासेस को कक्षाओं के समानांतर एक विरासत योजना का पालन करना चाहिए (उदाहरण के लिए यदि कक्षा A का मूल वर्ग वर्ग B है, तो A का मेटाक्लास का मूल वर्ग B का मेटाक्लास है), रूट वर्ग को छोड़कर।
स्मॉलटाक के विपरीत, रूट क्लास का मेटाक्लास रूट क्लास (आमतौर पर NSObject कोको (एपीआई) ढांचे का उपयोग करके)। यह सुनिश्चित करता है कि सभी क्लास ऑब्जेक्ट्स अंततः रूट क्लास के उदाहरण हैं, ताकि आप रूट क्लास के इंस्टेंस विधियों का उपयोग कर सकें, आमतौर पर ऑब्जेक्ट्स के लिए उपयोगी उपयोगिता विधियों, क्लास ऑब्जेक्ट्स पर स्वयं।
चूँकि मेटाक्लास ऑब्जेक्ट्स अलग तरह से व्यवहार नहीं करते हैं (आप मेटाक्लास के लिए क्लास मेथड्स नहीं जोड़ सकते हैं, इसलिए मेटाक्लास ऑब्जेक्ट्स में सभी समान तरीके हैं), वे सभी एक ही क्लास के उदाहरण हैं- रूट क्लास के मेटाक्लास (स्मॉलटाक के विपरीत)। इस प्रकार, रूट क्लास का मेटाक्लास स्वयं का एक उदाहरण है। इसका कारण यह है कि सभी मेटाक्लास मूल वर्ग से प्राप्त होते हैं; इसलिए, उन्हें रूट क्लास के क्लास मेथड्स को इनहेरिट करना होगा।[9]
भाषाओं और उपकरणों में समर्थन
निम्नलिखित कुछ सबसे प्रमुख प्रोग्रामिंग लैंग्वेज हैं जो मेटाक्लासेस को सपोर्ट करती हैं।
- सामान्य लिस्प , कॉमन लिस्प ऑब्जेक्ट सिस्टम के माध्यम से
- [[डेल्फी (प्रोग्रामिंग भाषा)]] और इससे प्रभावित वस्तु पास्कल के अन्य संस्करण
- ग्रूवी (प्रोग्रामिंग भाषा)
- उद्देश्य सी
- पायथन (प्रोग्रामिंग भाषा)
- पर्ल, मेटाक्लास प्रगमा के साथ-साथ मूस (पर्ल)
- रूबी (प्रोग्रामिंग भाषा)
- गपशप
- सी ++ (सी ++ 23 के लिए योजना बनाई गई)[10]
मेटाक्लास का समर्थन करने वाली कुछ कम व्यापक भाषाओं में OpenJava, OpenC++ (सॉफ़्टवेयर टूल)|OpenC++, OpenAda, CorbaScript, ObjVLisp, Object-Z, MODEL-K, XOTcl, और MELDC सम्मिलित हैं। इनमें से कई भाषाएँ 1990 के दशक की शुरुआत की हैं और अकादमिक रुचि की हैं।[11] लॉगटॉक, प्रोलॉग का एक वस्तु-उन्मुख विस्तार, मेटाक्लासेस का भी समर्थन करता है।
संसाधन विवरण ढांचा (RDF) और एकीकृत मॉडलिंग भाषा (UML) दोनों मेटाक्लासेस को सपोर्ट करते हैं।
यह भी देखें
संदर्भ
- ↑ Ira R. Forman and Scott Danforth (1999). मेटाक्लासेस को काम में लाना. ISBN 0-201-43305-2.
- ↑ IBM Metaclass programming in Python, parts 1 Archived 2008-09-03 at the Wayback Machine, 2 and 3
- ↑ Artima Forum: Metaclasses in Python 3.0 (part 1 of 2) (part 2 of 2)
- ↑ David Mertz. "पायथन मेटाक्लास प्रोग्रामिंग पर एक प्राइमर". ONLamp. Archived from the original on April 30, 2003. Retrieved June 28, 2006.
- ↑ "The Ruby Object Model: Comparison with Smalltalk-80".
- ↑ Paolo Perrotta (2010). Metaprogramming Ruby. Pragmatic Bookshelf. ISBN 978-1-934356-47-0.
- ↑ "Object Membership: The Core Structure of Object Technology".
- ↑ "struct". Ruby Doc. Retrieved 1 May 2015.
- ↑ Cocoa with Love: What is a meta-class in Objective-C?
- ↑ Herb Sutter. "मेटाक्लासेस" (PDF).
- ↑ "मेटाक्लासेस का उपयोग करके जावा में मिक्सिन्स का कार्यान्वयन" (PDF). Archived from the original (PDF) on 2007-10-16. Retrieved 2007-11-27.