इस रूप में की उम्मीद काम करता है:क्लासमेड के सुपर को दूसरी तर्क की आवश्यकता क्यों है?
>>> class Foo(object):
... @classmethod
... def hello(cls):
... print 'hello, foo'
...
>>> class Bar(Foo):
... @classmethod
... def hello(cls):
... print 'hello, bar'
... super(Bar, cls).hello()
...
>>> b = Bar()
>>> b.hello()
hello, bar
hello, foo
मैं भी स्पष्ट रूप से आधार वर्ग कॉल कर सकते हैं:
>>> class Bar(Foo):
... @classmethod
... def hello(cls):
... print 'hello, bar'
... Foo.hello()
...
>>> b = Bar()
>>> b.hello()
hello, bar
hello, foo
मैं सोच रहा था कि मैं क्यों super
को पहले तर्क को छोड़ नहीं कर सकते हैं, इस तरह:
>>> class Bar(Foo):
... @classmethod
... def hello(cls):
... print 'hello, bar'
... super(Bar).hello()
...
>>> b = Bar()
>>> b.hello()
hello, bar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in hello
AttributeError: 'super' object has no attribute 'hello'
जब super
के परिणाम दूसरे तर्क के बिना कॉल एक सुपर प्रकार के अंदर एक वर्ग प्रकार लगता है :
>>> class Bar(Foo):
... @classmethod
... def hello(cls):
... print Foo, type(Foo)
... print super(Bar), type(super(Bar))
... print cls, type(cls)
...
>>> b = Bar()
>>> b.hello()
<class '__main__.Foo'> <type 'type'>
<super: <class 'Bar'>, NULL> <type 'super'>
<class '__main__.Bar'> <type 'type'>
मुझे लगता है कि मैं यहां डिजाइन के बारे में सोच रहा हूं। बेस क्लास प्रकार Foo
का संदर्भ प्राप्त करने के लिए मुझे क्लास ऑब्जेक्ट को सुपर कॉल में क्यों पारित करने की आवश्यकता होगी? एक सामान्य विधि के लिए, फ़ंक्शन में self
पास करना समझ में आता है, क्योंकि इसे कक्षा के वास्तविक उदाहरण में बेस क्लास प्रकार को बांधना होगा। लेकिन एक वर्ग विधि को कक्षा के विशिष्ट उदाहरण की आवश्यकता नहीं है।
संपादित: मैं अजगर 3.2 में एक ही त्रुटि मिलती है के रूप में मैं super(Bar).hello()
के लिए 2.7 में ऊपर है। हालांकि, मैं बस super().hello()
कर सकता हूं और यह ठीक काम करता है।
पायथन 3.x में वे सुपर कॉल को थोड़ा सा ठीक करते हैं ... python2x में उन्होंने अभी तक इतना नहीं सोचा था (मेरा अनुमान है ...) मुझे लगता है कि यह बंद होने जा रहा है जैसा कि "क्यों" प्रश्न आमतौर पर होते हैं ... –
आपको यह उपयोगी मिल सकता है: http://stackoverflow.com/questions/11354786/super-confusing-python-multiple-inheritance-super?rq=1 – mdscruggs
@ जोरनबेस्ले मेह, मैं मैंने कई कारणों से पूछा है कि इससे पहले कि बंद नहीं किया गया है। – jterrace