कभी-कभी ग्रंथों को विवरण के बजाय विचार के स्वाद के लिए अधिक पढ़ना पड़ता है। यह उन मामलों में से एक है।
में लिंक किए गए पृष्ठ , उदाहरण 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)
) कभी भी सही नहीं होता है।