2011-01-13 12 views
7

कक्षा के सुपरक्लास की विधि प्राप्त करने के लिए मैं super का उपयोग क्यों नहीं कर सकता?पायथन: मैं कक्षा में 'सुपर' का उपयोग क्यों नहीं कर सकता?

उदाहरण:

Python 3.1.3 
>>> class A(object): 
...  def my_method(self): pass 
>>> class B(A): 
...  def my_method(self): pass 
>>> super(B).my_method 
Traceback (most recent call last): 
    File "<pyshell#2>", line 1, in <module> 
    super(B).my_method 
AttributeError: 'super' object has no attribute 'my_method' 

(बेशक यह एक तुच्छ मामले में जहां मैं सिर्फ A.my_method कर सकता है, लेकिन मैं हीरे की विरासत का एक मामले के लिए इस की जरूरत है।)

super के अनुसार प्रलेखन, ऐसा लगता है कि मैं क्या संभव होना चाहिए। यह 'super रों प्रलेखन है: (जोर मेरा)

super() -> एक ही रूप में super(__class__, <first argument>)

super(type) -> अनबाउंड सुपर वस्तु

super(type, obj) -> बाध्य super वस्तु; isinstance(obj, type)

सुपर (प्रकार, टाइप 2) -> बाध्य सुपर ऑब्जेक्ट की आवश्यकता है; आवश्यकता है issubclass (type2, प्रकार)

[गैर-प्रासंगिक उदाहरण संशोधित]

+0

मैं अपने उत्तर हटा दिया गया - मैं एक ही त्रुटि मिली। बहुत अजीब, इसमें थोड़ा और देखेंगे। –

उत्तर

7

this के अनुसार ऐसा लगता है जैसे मैं सिर्फ super(B, B).my_method कॉल करने की आवश्यकता:

>>> super(B, B).my_method 
<function my_method at 0x00D51738> 
>>> super(B, B).my_method is A.my_method 
True 
+0

दिलचस्प। पता नहीं था कि काम करेगा। – James

+1

लिंक किए गए स्रोत को खुशी मिली। :) – James

+3

याद रखें कि यह आपको अनबाउंड विधियों देगा; आपको सामान्य रूप से 'सुपर (बी, स्वयं)' कहने की आवश्यकता है, बाध्य विधियों को पुनर्प्राप्त करने के लिए किसी ऑब्जेक्ट से जुड़ी एक सुपर ऑब्जेक्ट प्राप्त करना है। –

8

यह है जैसे कि आप बी का एक उदाहरण की जरूरत दूसरा तर्क के रूप में में पारित करने के लिए लग रहा है।

http://www.artima.com/weblogs/viewpost.jsp?thread=236275

+0

+1, इस आलेख श्रृंखला के अच्छे पढ़ने, भाग 2/3 'अनबाउंड सुपर ऑब्जेक्ट्स' के लिए सटीक समस्याओं और वास्तविक उपयोग केस का वर्णन करता है: http://www.artima.com/weblogs/viewpost.jsp?thread=236278 (अनबाउंड सुपर ऑब्जेक्ट्स के रहस्य) – ChristopheD

संबंधित मुद्दे