2010-05-05 13 views
20

का उपयोग मुझे आश्चर्य है कि पाइथन 3 super() के स्वाद का उपयोग कब करें।पायथन 3 सुपर()

Help on class super in module builtins: 

class super(object) 
| super() -> same as super(__class__, <first argument>) 
| super(type) -> unbound super object 
| super(type, obj) -> bound super object; requires isinstance(obj, type) 
| super(type, type2) -> bound super object; requires issubclass(type2, type) 

अब तक मैं केवल तर्क के बिना super() का उपयोग किया है और यह उम्मीद के रूप में (एक जावा डेवलपर द्वारा) में काम किया।

सवाल:

  • क्या "बाध्य" करता है इस संदर्भ में क्या मतलब है?
  • बाध्य और अनबाउंड सुपर ऑब्जेक्ट के बीच क्या अंतर है?
  • super(type, obj) और super(type, type2) का उपयोग कब करें?
  • क्या सुपर क्लास नाम Mother.__init__(...) में बेहतर होगा?

उत्तर

17

के प्रदर्शन के लिए निम्नलिखित वर्गों का उपयोग करने दें:

>>> super(B).m 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'super' object has no attribute 'm' 
>>> super(B).__get__(B(), B) 
<super: <class 'B'>, <B object>> 

super वस्तु बाध्य:

class A(object): 
    def m(self): 
     print('m') 

class B(A): pass 

अनबाउंड super वस्तु वर्ग के लिए विशेषता का उपयोग प्रेषण नहीं है, आप वर्णनकर्ता प्रोटोकॉल का उपयोग करने के लिए है उदाहरण के लिए बाध्य विधियां प्रदान करती हैं:

>>> super(B, B()).m 
<bound method B.m of <__main__.B object at 0xb765dacc>> 
>>> super(B, B()).m() 
m 

super वस्तु वर्ग के लिए बाध्य (अजगर 2 के मामले में अबाध विधि) समारोह देता है:

>>> super(B, B).m 
<function m at 0xb761482c> 
>>> super(B, B).m() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: m() takes exactly 1 positional argument (0 given) 
>>> super(B, B).m(B()) 
m 

देखें मिशेल Simionato के ब्लॉग पोस्ट श्रृंखला (1, 2, 3) "हालात अजगर सुपर बारे में पता करने के लिए" और अधिक के लिए सूचना

+0

सवाल, python3 के बारे में विशेष रूप से है, लेकिन Simionato के ब्लॉग पोस्ट श्रृंखला को Python2 के बारे में हैं, और उल्लेख है कि * लाभ यह है कि आप के नाम को दोहराने के लिए से बचने के है कॉलिंग सिंटैक्स में कक्षा, क्योंकि वह नाम निजी नामों के मैंगलिंग तंत्र में छिपा हुआ है। *। यह Python3 में अब सत्य नहीं है, इसलिए कम से कम एक लाभ दिनांकित है। – gerrit

7

एक त्वरित नोट, super का नया उपयोग PEP3135 New Super में उल्लिखित है जिसे पायथन 3.0 में लागू किया गया था। विशेष प्रासंगिकता में से;

super().foo(1, 2) 

वर्ष को बदलने के लिए:

super(Foo, self).foo(1, 2)