पायथन में बेस क्लास के क्लासमेथोड को कॉल करना


105

निम्नलिखित कोड पर विचार करें:

class Base(object):

    @classmethod
    def do(cls, a):
        print cls, a

class Derived(Base):

    @classmethod
    def do(cls, a):
        print 'In derived!'
        # Base.do(cls, a) -- can't pass `cls`
        Base.do(a)

if __name__ == '__main__':
    d = Derived()
    d.do('hello')

> $ python play.py  
> In derived! 
> <class '__main__.Base'> msg

से Derived.do, मैं कैसे कॉल Base.doकरूं?

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

उपरोक्त उदाहरण में, वर्ग के बजाय कक्षा Base.do(a)प्रिंट करता है ।BaseDerived


जवाबों:


121

यदि आप एक नई शैली की कक्षा का उपयोग कर रहे हैं (अर्थात objectपायथन 2 से, या हमेशा पायथन 3 में), तो आप इसे super()इस तरह से कर सकते हैं :

super(Derived, cls).do(a)

यह है कि आप बेस क्लास के विधि के संस्करण (यानी print cls, a) से व्युत्पन्न वर्ग से कोड प्राप्त करेंगे, जिसे व्युत्पन्न वर्ग clsमें सेट किया जाएगा।


8
उह उह .. यह कैसे आया मुझे कभी नहीं लगा कि मैं superक्लासमेथोड पर भी उपयोग कर सकता हूं ।
श्रीधर रत्नाकुमार

यह केवल काम करता है (सुपर द्वारा लगाए गए एक सीमा के कारण) यदि आधार वस्तु से प्राप्त होता है, है ना? अगर ऐसा नहीं है तो आप क्या करते हैं?
अरसा-लोंगा-विटा-ब्रेविस

हाँ, यह केवल नई शैली की कक्षाओं के लिए काम करता है, जो इससे प्राप्त होते हैं object। (कम से कम पायथन 2 में, लेकिन मुझे लगता है कि Py3 में सभी कक्षाएं नई शैली की हैं, IIRC) अन्यथा आपको करना होगा Base.do(self, ...), मुझे लगता है, जिससे सुपरक्लास का नाम हार्ड-कोडिंग होता है।
डेविड जेड

अंदर Derived.do(), के clsरूप में ही नहीं है Derived?
रे

@ रे अगर यह वास्तव Derivedमें एक उपवर्ग का नहीं बल्कि एक उदाहरण है , तो हाँ।
डेविड जेड 10

15

यह एक समय हो गया है, लेकिन मुझे लगता है कि मुझे जवाब मिल सकता है। जब आप एक क्लासमेथोड बनने के लिए एक विधि को सजाने के लिए मूल अनबाउंड विधि 'im_func' नामक संपत्ति में संग्रहीत की जाती है:

class Base(object):
    @classmethod
    def do(cls, a):
        print cls, a

class Derived(Base):

    @classmethod
    def do(cls, a):
        print 'In derived!'
        # Base.do(cls, a) -- can't pass `cls`
        Base.do.im_func(cls, a)

if __name__ == '__main__':
    d = Derived()
    d.do('hello')

2
नोट: यह दृष्टिकोण पुरानी शैली की कक्षाओं के लिए काम करता है जहां सुपर () काम नहीं करता है
एलेक्स क्यू

2
__func__अजगर 2.7 और 3 के रूप में भी उपलब्ध है
dtheodor

-3

यह मेरे लिए काम करता है:

Base.do('hi')

9
इसके बाद clsतर्क की Baseबजाय बाध्य किया जाएगाDerived
श्रीधर रत्नाकुमार

मेरे लिए यह क्या काम करता है - जो नेड के उत्तर की तरह दिखता है (बहुत कुछ): जहां से स्वयं का पता चलता है QGraphicsView से जिसमें पेंट एवेंट (QPaintEvent) डिफ पेंट एवेंट (सेल्फ, क्यूपेंट इवेंट): प्रिंट डीआईआर (सेल्फ) QGraphicsView.paintEvent (सेल्फ, क्यूपेंट इवेंट)
user192127
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.