वर्ग (डिफ़ॉल्ट रूप से) type
के उदाहरण हैं। बस Foo
के उदाहरण के रूप में foo = Foo(...)
, type
(यानी एक वर्ग) का उदाहरण myclass = type(name, bases, clsdict)
द्वारा बनाया गया है।
यदि आप वर्ग निर्माण के पल में कुछ खास होना चाहते हैं, तो आपको कक्षा बनाने वाली चीज़ को संशोधित करना होगा - यानी type
। ऐसा करने का तरीका type
के उप-वर्ग को परिभाषित करना है - यानी मेटाक्लास। के रूप में एक वर्ग अपनी उदाहरण है
एक metaclass अपने वर्ग के लिए है।
को Python2 में आप
class SuperClass:
__metaclass__ = Watcher
जहां Watcher
type
का एक उपवर्ग है के साथ एक वर्ग के metaclass को परिभाषित करेगा।
python3 में वाक्य रचना
class SuperClass(metaclass=Watcher)
को बदल दिया गया है दोनों
Superclass = Watcher(name, bases, clsdict)
जहां इस मामले में, name
स्ट्रिंग 'Superclass'
के बराबर होती है के बराबर हैं, और bases
टपल (object,)
है। clsdict
कक्षा परिभाषा के शरीर में परिभाषित वर्ग विशेषताओं का एक शब्दकोश है।
नोट myclass = type(name, bases, clsdict)
को समानता।
तो, बस के रूप में आप एक वर्ग के __init__
एक उदाहरण के निर्माण के समय की घटनाओं को नियंत्रित करने के प्रयोग करेंगे, तो आप एक वर्ग के निर्माण के समय की घटनाओं के साथ नियंत्रित कर सकते हैं एक metaclass के __init__
:
class Watcher(type):
def __init__(cls, name, bases, clsdict):
if len(cls.mro()) > 2:
print("was subclassed by " + name)
super(Watcher, cls).__init__(name, bases, clsdict)
class SuperClass:
__metaclass__ = Watcher
print("foo")
class SubClass0(SuperClass):
pass
print("bar")
class SubClass1(SuperClass):
print("test")
प्रिंट
foo
was subclassed by SubClass0
bar
test
was subclassed by SubClass1
मेटाक्लास का उपयोग करें; वर्गों को बनाए जाने पर मेटाक्लास को बुलाया जाता है, जैसे कि उदाहरण बनाए जाने पर वर्गों को बुलाया जाता है। –
कोई उत्तर नहीं जोड़ सकता है, लेकिन आज python3.6 में '__init_subclass__' है - इसे जांचें! –
@OrDuan: धन्यवाद, उपयोगी लगता है। इस सवाल को एक डुप्लिकेट को अन-मार्क करने के लिए भी पर्याप्त कारण हो सकता है, क्योंकि अब "मेटाक्लास का उपयोग करें" की बजाय मेरी समस्या के लिए एक समर्पित समाधान है। –