कभी-कभी ग्रंथों को विवरण के बजाय विचार के स्वाद के लिए अधिक पढ़ना पड़ता है। यह उन मामलों में से एक है।
में लिंक किए गए पृष्ठ , उदाहरण 2.5, 2.6 और 2.7 चाहिए सब एक प्रयोग विधि, do_your_stuff। (अर्थात, do_somethingको बदल दिया जाना चाहिएdo_your_stuff ।)
इसके अलावा, जैसा कि नेड डीली ने बताया , A.do_your_stuffएक वर्ग विधि है।
class A(object):
@classmethod
def do_your_stuff(cls):
print 'This is A'
class B(A):
@classmethod
def do_your_stuff(cls):
super(B, cls).do_your_stuff()
B.do_your_stuff()
super(B, cls).do_your_stuff
एक बाध्य विधि देता है ( फुटनोट 2 देखें )। चूंकि clsदूसरा तर्क के रूप में पारित किया गया था super(), इसलिए यह है clsकि लौटे विधि के लिए बाध्य हो जाता है। दूसरे शब्दों में, clsविधि के पहले तर्क के रूप में पारित हो जाता हैdo_your_stuff() कक्षा ए के ।
दोहराना करने के लिए: super(B, cls).do_your_stuff()कारणों Aकी do_your_stuffविधि के साथ कहा जा clsपहला तर्क के रूप में पारित कर दिया। है कि काम करने के लिए, के लिए आदेश में Aकी
do_your_stuff एक वर्ग विधि हो गया है। लिंक किए गए पृष्ठ में ऐसा उल्लेख नहीं है, लेकिन यह निश्चित रूप से मामला है।
पुनश्च। do_something = classmethod(do_something)एक classmethod बनाने का पुराना तरीका है। नया (एर) तरीका @classmethod डेकोरेटर का उपयोग करना है।
ध्यान दें कि super(B, cls)इसे प्रतिस्थापित नहीं किया जा सकता है super(cls, cls)। ऐसा करने से अनंत लूप बन सकते हैं। उदाहरण के लिए,
class A(object):
@classmethod
def do_your_stuff(cls):
print('This is A')
class B(A):
@classmethod
def do_your_stuff(cls):
print('This is B')
super(cls, cls).do_your_stuff()
class C(B):
@classmethod
def do_your_stuff(cls):
print('This is C')
super(cls, cls).do_your_stuff()
C.do_your_stuff()
उठेंगे RuntimeError: maximum recursion depth exceeded while calling a Python object ।
यदि clsहै C, तो उसके बाद आने वाले वर्ग को super(cls, cls)खोजता है ।C.mro()C
In [161]: C.mro()
Out[161]: [__main__.C, __main__.B, __main__.A, object]
चूंकि वह वर्ग है B, जब clsहै C, super(cls, cls).do_your_stuff() हमेशा कॉल करता है B.do_your_stuff। चूंकि super(cls, cls).do_your_stuff()अंदर कहा जाता है B.do_your_stuff, आप कॉल करना समाप्त करते हैंB.do_your_stuff एक अनंत लूप में ।
Python3 में, 0-तर्क के रूपsuper को जोड़ा गया था, इसलिए super(B, cls)इसे प्रतिस्थापित किया जा सकता है super(), और Python3 इस संदर्भ में पता लगाएगा कि किसकी super()परिभाषा के class Bबराबर होना चाहिए super(B, cls)।
लेकिन किसी भी परिस्थिति में super(cls, cls)(या समान कारणों से super(type(self), self)) कभी भी सही नहीं होता है।