2014-11-06 10 views
24

क्या सुपर() का मतलब staticmethods के साथ नहीं किया जाना चाहिए?सुपर() और @staticmethod इंटरैक्शन

जब मैं मैं त्रुटि

Traceback (most recent call last): 
    File "asdf.py", line 13, in <module> 
    a = Second.getlist() 
    File "asdf.py", line 9, in getlist 
    l = super(Second).getlist() 
AttributeError: 'super' object has no attribute 'getlist' 

निम्नलिखित हो, तो मैं सुपर (करने के लिए classmethods को staticmethods बदल सकते हैं और वर्ग उदाहरण पारित), चीजों को ठीक से काम की तरह

class First(object): 
    @staticmethod 
    def getlist(): 
    return ['first'] 

class Second(First): 
    @staticmethod 
    def getlist(): 
    l = super(Second).getlist() 
    l.append('second') 
    return l 

a = Second.getlist() 
print a 

कुछ प्रयास करें। क्या मैं यहां सुपर (टाइप) गलत तरीके से फोन कर रहा हूं या क्या मुझे कुछ याद आ रही है?

उत्तर

29

को संक्षिप्त उत्तर मैं गलत तरीके से यहां सुपर (प्रकार) बोल रहा हूँ या वहाँ कुछ मैं याद कर रहा हूँ है?

है: हाँ, आप इसे गलत तरीके से बुला रहे हैं ... और (वास्तव में, क्योंकि) कुछ ऐसा है जो आप गायब हैं।

लेकिन बुरा महसूस न करें; यह एक बेहद मुश्किल विषय है।

documentation नोटों कि दूसरा तर्क छोड़ दिया जाता है

हैं, तो सुपर वस्तु लौटे अबाध है।

अनबाउंडsuper वस्तुओं के लिए उपयोग के मामले अत्यंत संकीर्ण और दुर्लभ है।

इसके अलावा, उन्होंने दृढ़ता से तर्क है अनबाउंड super दूर करने के लिए: super() पर अपनी चर्चा के लिए मिशेल Simionato द्वारा इन लेख देखें पायथन 3 here से।

मैंने कहा कि आप इसे "गलत तरीके से" कह रहे थे (हालांकि शुद्धता संदर्भ के बिना काफी हद तक व्यर्थ है, और खिलौना उदाहरण अधिक संदर्भ नहीं देता है)। चूंकि अनबाउंड super सिमियोनाटो द्वारा तर्क दिया गया है, तो संभवतः केवल दुर्लभ, और संभवत: केवल फ्लैट-आउट अनुचित है, super() का उपयोग करने के लिए "सही" तरीका दूसरा तर्क प्रदान करना है।यदि आप यह हास्यास्पद है कि जिस तरह से लग रहा है लगता है

आपके मामले में, अपने उदाहरण काम करने के लिए सबसे आसान तरीका

class First(object): 
    @staticmethod 
    def getlist(): 
    return ['first'] 

class Second(First): 
    @staticmethod 
    def getlist(): 
    l = super(Second, Second).getlist() # note the 2nd argument 
    l.append('second') 
    return l 

a = Second.getlist() 
print a 

है, तो आप गलत नहीं कर रहे हैं। लेकिन मुझे लगता है कि जब वे super(X) देखते हैं (या जब वे इसे अपने कोड में आज़माते हैं तो उम्मीद करते हैं कि अधिकांश लोग क्या उम्मीद कर रहे हैं) यदि आप super(X, X) करते हैं तो पाइथन आपको क्या देता है।

+1

क्या यह पाइथन 3 में कोई अलग है, जहां किसी भी तर्क के बिना 'सुपर()' नियमित तरीके से इसे कॉल करने का सामान्य तरीका है? 'Super()। Foo() 'को कॉल करते समय मुझे Python3 में एक ही समस्या थी। – gerrit

+4

@gerrit: पायथन 3 का शून्य-तर्क 'सुपर() 'केवल कक्षा या उदाहरण विधियों में काम करता है। यह उस जादू के कारण है जो यह निर्धारित करने के लिए उपयोग करता है कि किस वर्ग में इसे परिभाषित किया जा रहा है। स्थिर तरीकों के भीतर (जैसे नियमित रूप से, मॉड्यूल-स्तरीय फ़ंक्शंस में), आपको अभी भी दो स्पष्ट तर्कों की आवश्यकता है। (पाइथन 3 में एकल-तर्क फ़ॉर्म अभी भी अनबाउंड है) –

1

जब आप किसी ऑब्जेक्ट इंस्टेंस पर सामान्य विधि को कॉल करते हैं, तो विधि ऑब्जेक्ट इंस्टेंस को पहले पैरामीटर के रूप में प्राप्त करती है। यह एचटीई ऑब्जेक्ट और उसके मूल वर्ग की कक्षा प्राप्त कर सकता है, इसलिए super पर कॉल करना समझ में आता है।

जब आप किसी ऑब्जेक्ट इंस्टेंस या क्लास पर क्लासमे विधि विधि को कॉल करते हैं, तो विधि क्लास को पहले पैरामीटर के रूप में प्राप्त करती है। यह अभिभावक वर्ग प्राप्त कर सकता है, इसलिए super पर कॉल करना समझ में आता है।

लेकिन जब आप एक staticmethod विधि कहते हैं, तो विधि को कुछ भी प्राप्त नहीं होता है, इसका कोई तरीका नहीं है कि उसे किस ऑब्जेक्ट या क्लास कहा जाता है। यही कारण है कि आप staticmethod में super तक नहीं पहुंच सकते हैं।

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