2011-10-10 11 views

उत्तर

14

आप एक नंगे super() कॉल का उपयोग नहीं कर सकते जिसमें कोई प्रकार/वर्ग नहीं है। न ही आप इसके लिए एक प्रतिस्थापन लागू कर सकते हैं जो काम करेगा। पीईपी देख 3135

+1

धन्यवाद। मैं उलझन में था क्योंकि इस पीईपी के पहले संस्करण ने कहा था कि आप इसे '__future__ आयात new_super' से आयात करेंगे जो काम नहीं करता है। –

6

नहीं, आप नहीं कर सकते। लेकिन आप पाइथन 3 के super() पायथन 3 का उपयोग कर सकते हैं।

3

नोट यह एक भयानक "समाधान" है, मैं इसे केवल के लिए पोस्ट - अजगर 3.x विशेष समर्थन नंगे super() कॉल सक्षम करना (यह सभी कार्य एक वर्ग के भीतर परिभाषित में एक __class__ सेल चर स्थानों में शामिल है ! घर पर ऐसा नहीं सुनिश्चित करें कि आपने करते
मैं फिर कहता हूँ: इस

एक ऐसा नहीं करते हैं इस mixin

class Super(object): 
    def super(self): 
     return super(self.__class__, self) 
उपयोग करने के बारे में सोच सकते हैं

प्राप्त करने के लिए एक self.super():

class A(object, Super): 
    def __init__(self): 
     print "A" 

class B(A): 
    def __init__(self): 
     print "B" 
     self.super().__init__() 

उपज:

>>> a = A() 
A 
>>> b = B() 
B 
A 

लेकिन सावधान रहना: यह self.super() है नहीं बराबर super(B, self) करने के लिए - यदि A भी self.super().__init__() कहा जाता है, एक B के निर्माण के कारण होता है A कन्स्ट्रक्टर स्वयं को अनिश्चित काल तक कॉल करने के लिए, क्योंकि self.__class__B रहेगा । यह की कमी के कारण accepted answer में उल्लिखित है। आप संभावित रूप से एक छिपे हुए राज्य मशीन या एक परिष्कृत मेटाक्लास के साथ इस मुद्दे के आसपास काम कर सकते हैं उदा। self.__class__.mro() में वास्तविक वर्ग की स्थिति की जांच करता है, लेकिन क्या यह वास्तव में इसके लायक है? शायद नहीं ...

15

मुझे एहसास है कि यह प्रश्न पुराना है, और उस समय चयनित उत्तर सही हो सकता है, लेकिन यह अब पूरा नहीं हुआ है। तुम अब भी 2.5.6 में super() उपयोग कर सकते हैं नहीं है, लेकिन python-future 2.6+ के लिए एक back-ported implementation प्रदान करता है:

% pip install future 
... 
% python 
... 
>>> import sys 
>>> sys.version_info[:3] 
(2, 7, 9) 
>>> from builtins import * 
>>> super 
<function newsuper at 0x000000010b4832e0> 
>>> super.__module__ 
'future.builtins.newsuper' 
>>> class Foo(object): 
... def f(self): 
... print('foo') 
... 
>>> class Bar(Foo): 
... def f(self): 
... super().f() # <- whoomp, there it is 
... print('bar') 
... 
>>> b = Bar() 
>>> b.f() 
foo 
bar 

आप pylint का उपयोग करते हैं, तो आप टिप्पणी के साथ विरासत चेतावनी निष्क्रिय कर सकते हैं:

# pylint: disable=missing-super-argument 
+0

अच्छा एक, धन्यवाद :) –

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