2009-01-21 7 views
12

जब विधि श्रृंखलन करने के लिए पायथन के super() का उपयोग कर, आप स्पष्ट रूप से उदाहरण के लिए, अपने खुद के वर्ग में बताने की:सुपर() का उपयोग करते समय मुझे अपनी खुद की कक्षा क्यों निर्दिष्ट करनी है, और क्या इसके आसपास जाने का कोई तरीका है?

class MyDecorator(Decorator): 
    def decorate(self): 
     super(MyDecorator, self).decorate() 

मैं super() लिए एक तर्क के रूप मेरी कक्षा MyDecorator का नाम निर्दिष्ट करने के लिए है। यह DRY नहीं है। जब मैं अपनी कक्षा का नाम बदलता हूं तो मुझे इसे दो बार बदलना होगा। यह इस तरह से क्यों लागू किया जाता है? और कक्षा के नाम को दो बार (या अधिक) लिखने से बाहर निकलने का कोई तरीका है?

उत्तर

6

बीडीएफएल सहमत हैं। 2.6 के लिए 2.6 और PEP 3135 - New Super के लिए Pep 367 - New Super देखें।

+0

पीईपी के वर्तमान संस्करण से लिंक करें: http://www.python.org/dev/peps/pep-3135/ – sth

+0

'सुपर()' तर्क के बिना * नहीं * पायथन 2.6.1 – jfs

+0

पर काम करता है पीईपी 367 "superceded" किया प्रतीत होता है। मुझे कोई सबूत नहीं दिखता कि यह 2.7 में जोड़ा गया था। मुझे लगता है कि यह एक 3.x- केवल सुविधा है। – Vultaire

11

आपकी इच्छाएं सच होती हैं:

बस पाइथन 3.0 का उपयोग करें। इसमें आप super() का उपयोग करें और यह super(ThisClass, self) है।

प्रलेखन here

class C(B): 
    def method(self, arg): 
     super().method(arg)  
     # This does the same thing as: super(C, self).method(arg) 
0

आप भी

def __init__(self): 
    super(self.__class__, self) 
    ... 
+4

नहीं, यह काम नहीं करेगा क्योंकि __class__ आपको उदाहरण के लिए सबसे विशिष्ट सबक्लास प्रदान करेगा, जरूरी नहीं कि हम जिस वर्ग को लिख रहे हैं उसके संदर्भ में। – airportyh

+2

मुझे लगता है कि इस जवाब को कम करने के लिए लेखक के लिए यह अनुचित है। यह जवाब एक बेवकूफ लेकिन आम गलतफहमी बनाता है। यह कहने के लायक है कि यह टॉबी के स्पष्टीकरण के साथ क्यों काम करने में विफल रहता है। रिपोर्टिंग विधियों में मूल्यवान है जो भी काम नहीं करते हैं। – gotgenes

3

का उपयोग करके अजगर के पुराने संस्करणों में एक ठोस वर्ग के नाम लिख से बच सकते हैं इस सवाल का जवाब है गलत, कोशिश:

def _super(cls): 
    setattr(cls, '_super', lambda self: super(cls, self)) 
    return cls 

class A(object): 
    def f(self): 
     print 'A.f' 

@_super 
class B(A): 
    def f(self): 
     self._super().f() 

@_super 
class C(B): 
    def f(self): 
     self._super().f() 

C().f() # maximum recursion error 

प्रलेखन से कोड का नमूना

पायथन 2 में सजावट का उपयोग करने का एक तरीका है:

def _super(cls): 
    setattr(cls, '_super', lambda self: super(cls, self)) 
    return cls 

class A(object): 
    def f(self): 
     print 'A.f' 

@_super 
class B(A): 
    def f(self): 
     self._super().f() 

B().f() # >>> A.f 
संबंधित मुद्दे

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