दिलचस्प पोस्ट
एक्लिप्से जूनो / केप्लर / लुना सीडीटी में सी ++ 11 सक्षम करना फ़ाइलों को ज़िप / अनझिप करने के लिए एक अच्छा जावा लाइब्रेरी क्या है? एंड्रॉइड पर मीडियास्टोर का उपयोग करते हुए मैं कैमरे से डिस्क पर डेटा कैसे बचा सकता हूं? पीडीओ के लिए real_escape_string () के बराबर क्या है? .resx फ़ाइल में सभी संसाधनों के माध्यम से लूप क्यों एचटीएमएल 5 आईओएस 8 वेबपैकेज (वेबव्यू) में नहीं खेलता है? UIAlertController – कस्टम दृश्य को कार्यपत्रक में जोड़ें jQuery 1.8 ईवेंट हैंडलर्स ढूंढें एक इंडेक्स द्वारा वेक्टर को विभाजित करने और उस विभाजन पर ऑपरेशन करने के लिए रेशमी आर कोड सी में पॉइंटर्स और पॉइंटर्स को पॉइंटर्स के रूप में कार्य करने के लिए एरे और मैट्रिक्स उत्तीर्ण करना मैं हेक्स स्ट्रिंग से UIColor कैसे बना सकता हूं? जावा वर्ग को तुलनीय क्यों लागू करना चाहिए? मैं सीएसएस के साथ अपने divs को पुन: क्रमित कैसे कर सकता हूँ? क्लास .getResource () रिक्त देता है क्यों glReadPixels () आईओएस 6.0 में इस कोड में असफल रहे हैं?

अजगर 3.x के सुपर () जादू क्यों है?

पायथन 3.x में, super() को तर्क के बिना बुलाया जा सकता है:

 class A(object): def x(self): print("Hey now") class B(A): def x(self): super().x() 
 >>> B().x() Hey now 

यह काम करने के लिए, कुछ संकलन-समय का जादू किया जाता है, इसका एक परिणाम यह होता है कि निम्न कोड (जो super_ को super super_ ) विफल रहता है:

 super_ = super class A(object): def x(self): print("No flipping") class B(A): def x(self): super_().x() 
 >>> B().x() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in x RuntimeError: super(): __class__ cell not found 

super() कम्पाइलर से सहायता के बिना रनटाइम पर सुपरक्लास को हल करने में असमर्थ क्यों है? क्या ऐसी व्यावहारिक स्थितियां हैं जिनमें यह व्यवहार, या उसके लिए अंतर्निहित कारण, एक अनजान प्रोग्रामर को काट सकता है?

… और, एक साइड प्रश्न के रूप में: क्या पायथन के कार्यों, विधियों आदि में कोई अन्य उदाहरण हैं, जिन्हें उन्हें अलग नाम पर रिबांड करके तोड़ा जा सकता है?

वेब के समाधान से एकत्रित समाधान "अजगर 3.x के सुपर () जादू क्यों है?"

नया जादू super() व्यवहार को ड्रिल (खुद को दोहराएं नहीं) सिद्धांत का उल्लंघन करने से बचने के लिए जोड़ा गया था, पीईपी 3135 देखें। इसे वैश्विक रूप से संदर्भित करके वर्ग को स्पष्ट रूप से नाम देने के साथ-साथ आप super() स्वयं super() साथ खोजे गए उसी रिबंडिंग मुद्दों पर भी प्रवण होते हैं:

 class Foo(Bar): def baz(self): return super(Foo, self).baz() + 42 Spam = Foo Foo = something_else() instance = Spam() # liable to blow up 

क्लास सज्जाकारों का उपयोग करने पर भी यही लागू होता है जहां डेकोरेटर एक नया ऑब्जेक्ट देता है, जो क्लास का नाम पुन: बांधा जाता है:

 @class_decorator_returning_new_class class Foo(Bar): def baz(self): # Now `Foo` is a *different class* return super(Foo, self).baz() + 42 

जादू super() __class__ सेल इन मुद्दों को अच्छी तरह से मूल वर्ग ऑब्जेक्ट तक पहुंच प्रदान करता है।

पीईपी को गियोडो द्वारा लात मारी गई थी, जो शुरू में super एक खोजशब्द बनने की कल्पना की थी , और वर्तमान वर्ग को देखने के लिए एक सेल का उपयोग करने का विचार भी उसका था । निश्चित रूप से, यह एक कीवर्ड बनाने का विचार पीईपी के पहले ड्राफ्ट का हिस्सा था।

हालांकि, यह वास्तव में स्वयं ग्वाडो था, जो तब कीवर्ड विचार से दूर 'बहुत जादुई' के रूप में कदम रखा , इसके बजाय वर्तमान कार्यान्वयन का प्रस्ताव उन्होंने अनुमान लगाया कि super() लिए एक अलग नाम का उपयोग करना एक समस्या हो सकती है :

मेरा पैच इंटरमीडिएट समाधान का उपयोग करता है: यह मानता है कि जब भी आप 'super' नामित चर का उपयोग करते हैं तो आपको __class__ आवश्यकता __class__ । इस प्रकार, यदि आप (विश्व स्तर पर) super का नाम बदलते हैं और supper का उपयोग करते हैं, लेकिन super नहीं है, तो यह तर्कों के बिना काम नहीं करेगा (लेकिन यदि आप इसे या तो __class__ या वास्तविक वर्ग ऑब्जेक्ट पास करते हैं तो भी यह काम करेगा); यदि आपके पास कोई असंबद्ध चर नामित super , तो चीजें काम करेंगी लेकिन विधि सेल चर के लिए उपयोग की जाने वाली थोड़ी धीमी कॉल पथ का उपयोग करेगी।

इसलिए, अंत में, यह स्वयं गुइडो था कि यह घोषित किया कि super खोजशब्द का उपयोग सही नहीं लग रहा था, और एक जादू __class__ प्रदान करना स्वीकार्य समझौता था।

मैं मानता हूं कि कार्यान्वयन के जादू, अंतर्निहित व्यवहार कुछ हद तक आश्चर्य की बात है, लेकिन super() भाषा में सबसे अधिक गलत उपयोग वाले कार्यों में से एक है। बस इंटरनेट पर पाए गए सभी super(self.__class__, self) super(type(self), self) या super(self.__class__, self) पर एक नज़र डालें; अगर उस कोड का कोई भी व्युत्पन्न वर्ग से कभी बुलाया गया था, तो आप अनंत अनंतकरण अपवाद के साथ समाप्त हो जाएंगे कम से कम सरलीकृत super() कॉल, बिना तर्क के, उस समस्या से बचा जाता है

नाम के super_ ; बस अपनी विधि में __class__ संदर्भ और यह फिर से काम करेगा। सेल बनाया जाता है यदि आप super() उपयोग करते हैं या अपनी विधि में __class__ का उपयोग करते हैं:

 >>> super_ = super >>> class A(object): ... def x(self): ... print("No flipping") ... >>> class B(A): ... def x(self): ... __class__ # just referencing it is enough ... super_().x() ... >>> B().x() No flipping