super()
साथ शुरू करने के लिए अपने आप में बस super(A, B)
, जहां A
वर्ग जिसमें कोड होता है के लिए आशुलिपि है, और B
जिसमें कोड होता है कार्य करने के लिए पहला तर्क है, इसलिए आपके विशेष मामले में, super().__new__(cls)
super(CarModel, cls).__new__(cls)
तक फैलता है।
बदले में, super(T, O)
एक "सुपर ऑब्जेक्ट" देता है। यह समझने के लिए कि एक सुपर ऑब्जेक्ट क्या करता है, आपको समझने की आवश्यकता है कि पाइथन में उदाहरण और कक्षाओं पर विशेषता संदर्भ कैसे हैं।
मान लिया जाये कि कोई __getattr__
या __getattribute__
तरीकों शामिल कर रहे हैं, एक वस्तु O
पर विशेषता A
संदर्भित (अर्थात, O.A
या getattr(O, "A")
का मूल्यांकन) के लिए निम्न चरण होकर गुज़रता है:
- तो
"A"
O
के उदाहरण में परिभाषित किया गया है dict (O.__dict__
), तो उस निर्देश पर मूल्य सीधे लौटा दिया जाता है, ठीक उसी तरह।
- अन्यथा,
O
के विधि संकल्प आदेश में से प्रत्येक कक्षा बदले में चेक की जाती है, "A"
उनके प्रत्येक डिब्बे में देखती है। यदि पाया जाता है, तो मान D
पर कॉल करें।
- यदि
D
बदले में, __get__
को परिभाषित नहीं करता है, तो यह वापस लौटाया जाता है।यदि ऐसा होता है, तो D
को "वर्णक" के रूप में जाना जाता है, और इसकी __get__
विधि को पहले तर्क के रूप में O
और दूसरे तर्क के रूप में type(O)
कहा जाता है।
एक वर्ग पर एक विशेषता संदर्भ में, एक ही काम करता है के बारे में उदाहरण के लिए वर्ग संदर्भ जा रहा है प्रतिस्थापन, निम्नलिखित अंतर के साथ:
- चरण 1 लागू नहीं होता।
__get__
विधि को पहले तर्क के रूप में None
के साथ बुलाया जाता है, और कक्षा को दूसरे के रूप में संदर्भित किया जाता है।
पायथन उदाहरण विधियों, कक्षा विधियों, स्थिर विधियों और गुणों जैसी चीजों को लागू करने के लिए वर्णनकर्ताओं का उपयोग करता है।
super(T, O)
के साथ बनाई गई एक सुपर वस्तु है, तो, एक (बिल्ट-इन) उस पर संदर्भ एक __getattribute__
विधि है जो हर पर कहा जाता है के साथ वस्तु विशेषता है, और केवल निम्नलिखित टी वर्गों के dicts में विशेषता ऊपर लग रहा हैO
के एमआरओ में। इसके बाद जो मूल्य मिलता है, वह सामान्य रूप से __get__
पर कॉल करता है।
प्रक्रिया थोड़ा जटिल है, इसलिए एक उदाहरण के रूप में, यह आपके विशिष्ट मामले पर कैसे काम करेगा। चूंकि CarModel
को परिभाषित किया गया है, इसलिए इसका एमआरओ [CarModel, object]
है।
super().__new__(cls)
ऊपर वर्णित अनुसार super(CarModel, cls).__new__(cls)
तक फैला है।
super(CarModel, cls)
का मूल्यांकन एक सुपर ऑब्जेक्ट S
उत्पन्न करने के लिए किया जाता है।
- पायथन
"__new__"
पर S
पर गुण प्राप्त करता है (पाइथन कोड में getattr(S, "__new__")
पर कॉल करने के बराबर)।
S
के बाद से CarModel
वर्ग पर बनाया गया था, यह CarModel
के एमआरओ में CarModel
निम्नलिखित वर्गों समझता है, और object
वर्ग के ही dict में "__new__"
पाता है। इसका मूल्य, एक स्थिर विधि, __get__
विधि है, जिसे None
और cls
तर्कों के साथ बुलाया जाता है। चूंकि __new__
एक स्थैतिक विधि है, इसकी __get__
विधि केवल कार्य को लौटती है, जैसा कि यह है, असम्बद्ध है। इसलिए, super(CarModel, cls).__new__
ठीक है object.__new__
जैसा ही है।
- अंतिम चरण में प्राप्त (अर्थात,
object.__new__
है) समारोह cls
तर्क है, जहां cls
शायद CarModel
, अंत में CarModel
वर्ग का एक नया उदाहरण है के साथ कहा जाता है।
मुझे आशा है कि यह सब समझ में आता है।
(पूर्णता के लिए के लिए, यह उल्लेखनीय है कि object
वर्ग पर वास्तविक __new__
समारोह वास्तव में एक स्थिर तरीका नहीं है, लेकिन एक विशेष समारोह में निर्मित बस सभी में कोई __get__
विधि है, लेकिन जब से __get__
स्थैतिक विधियों पर विधि केवल उस फ़ंक्शन को वापस लौटाएं, जिसका प्रभाव उनके साथ परिभाषित किया गया था, प्रभाव समान है।)
@Ben, [दस्तावेज़] (http://docs.python.org/py3k/reference/datamodel] पर आधारित है।एचटीएमएल # ऑब्जेक्ट्स-वैल्यू-एंड-टाइप), '__new __() '' cls' का एक उदाहरण देता है। क्यों कोड 'मॉडल = सुपर() .__ नया __ (सीएलएस) ' ओपी में 'cls' का उदाहरण बना सकता है? कारमोडेल की सुपर क्लास कैसे जानता है कि इसके सबक्लास का उदाहरण कैसे बनाया जाए? – q0987
यह अपने आप पर एक महान SO सवाल होगा (यदि यह पहले से ही नहीं पूछा गया है)। संक्षिप्त जवाब यह है कि आप इसे 'क्लास' पैरामीटर के साथ वर्तमान कक्षा पास कर रहे हैं। आखिरकार 'ऑब्जेक्ट .__ new__' पर वापस जाने के बिना बिल्कुल नया उदाहरण बनाने का कोई तरीका नहीं है, क्योंकि पाइथन के पास "आवंट आवंटित करने" के लिए कोई निर्देश नहीं है। लेकिन 'ऑब्जेक्ट .__ new__' यह कक्षा के एक उदाहरण को बनाने के लिए जानता है (जो ऑब्जेक्ट' का एक उदाहरण भी होगा, क्योंकि सब कुछ 'ऑब्जेक्ट' का उदाहरण है)। – Ben