यह समझने का मुख्य बिंदु super()
सहकारी विरासत को लागू करने के लिए है। कक्षाएं सहयोग कैसे आपके लिए प्रोग्रामर है। super()
जादू नहीं है और आप जो चाहते हैं उसे बिल्कुल नहीं पता! एक फ्लैट पदानुक्रम के लिए सुपर का उपयोग करने में बहुत कुछ नहीं है जिसे सहकारी विरासत की आवश्यकता नहीं है, इसलिए उस मामले में एस लॉट का सुझाव स्पॉट पर है। उपयोगी मई के उपवर्गों या अपने लक्ष्यों को :)
उदाहरण के लिए निर्भर करता है super()
उपयोग नहीं करना चाहते हो सकता है: - बी, लेकिन फिर आप की तरह तो एक < सी की प्रविष्टि का समर्थन करना चाहते - सार उ < है सी < - बी ।
class A(object):
"""I am an abstract abstraction :)"""
def foo(self):
raise NotImplementedError('I need to be implemented!')
class B(A):
"""I want to implement A"""
def foo(self):
print('B: foo')
# MRO Stops here, unless super is not A
position = self.__class__.__mro__.index
if not position(B) + 1 == position(A):
super().foo()
b = B()
b.foo()
class C(A):
"""I want to modify B and all its siblings (see below)"""
def foo(self):
print('C: foo')
# MRO Stops here, unless super is not A
position = self.__class__.__mro__.index
if not position(C) + 1 == position(A):
super().foo()
print('')
print('B: Old __base__ and __mro__:\n')
print('Base:', B.__bases__)
print('MRO:', B.__mro__)
print('')
# __mro__ change implementation
B.__bases__ = (C,)
print('B: New __base__ and __mro__:\n')
print('Base:', B.__bases__)
print('MRO:', B.__mro__)
print('')
b.foo()
और उत्पादन:
B: foo
B: Old __base__ and __mro__:
Base: (<class '__main__.A'>,)
MRO: (<class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
B: New __base__ and __mro__:
Base: (<class '__main__.C'>,)
MRO: (<class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)
B: foo
C: foo
स्रोत
2012-11-27 20:52:26
बहुत कम समझ में आता है कि। आपको पता होना चाहिए कि कौन सा सुपरक्लास विधियां लागू की गई हैं (जिसके लिए 'सुपर' समझ में आता है) और जिन्हें लागू नहीं किया गया है क्योंकि वे सार हैं। आप स्रोत पढ़ सकते हैं। –
'सिंटेक्स एरर' उठाएं भाषा में भी है। सवाल यह है कि "उस कोड को क्यों लिखें जब अमूर्त वर्ग का सरल निरीक्षण आपको उस कोड को लिखने से बचा सकता है"? –
@ एसएलओटी आह, अब समझ में आया। आपको इसे उत्तर के रूप में प्रस्तुत करना चाहिए, क्योंकि यह है। – gotgenes