2009-08-12 22 views
74

पर विचार करें निम्नलिखित कोड में एक आधार वर्ग के classmethod कॉलिंग:अजगर

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) कक्षा के बजाय Base कक्षा प्रिंट करता है।

+0

संबंधित: [कैसे अजगर में बच्चे कक्षा से एक माता पिता के वर्ग के विधि कॉल करने के?] (Http://stackoverflow.com/q/805066/95735) –

उत्तर

83
super(Derived, cls).do(a) 

संपादित: ओह, एक मिनट प्रतीक्षा करें ... यह स्पष्ट आप वास्तव में क्या कह रहे हैं नहीं है। इस प्रकार आप व्युत्पन्न वर्ग से विधि के बेस क्लास के संस्करण में कोड का आह्वान करेंगे।

+5

ओह उह .. यह मेरे साथ कभी नहीं हुआ कि मैं कक्षाओं पर भी 'सुपर' का उपयोग कर सकता हूं। –

+0

यदि यह ऑब्जेक्ट से प्राप्त होता है, तो यह केवल काम करता है (सुपर द्वारा लगाई गई सीमा के कारण) सही है? यदि ऐसा नहीं है तो आप क्या करते हैं? –

+0

हाँ, यह केवल नए-शैली वर्गों के लिए काम करता है, जो 'ऑब्जेक्ट' से प्राप्त होते हैं। (कम से कम पायथन 2 में, लेकिन पीई 3 में मुझे लगता है कि सभी वर्ग नई शैली हैं, आईआईआरसी) अन्यथा आपको 'बेस.डो (स्वयं, ...)' करना है, मुझे लगता है, इस प्रकार नाम का कड़ी कोडिंग सुपर क्लास। –

-2

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

Base.do('hi') 
+7

'cls' तर्क' व्युत्पन्न ' –

+0

के बजाय' बेस' 'के लिए बाध्य होगा, जो मेरे लिए काम करता है यह है - जो कि नेड के उत्तर की तरह दिखता है ( जहां स्वयं QGraphicsView से निकला है जिसमें पेंटएवेंट (QPaintEvent) है डीईएफ़ paintEvent (स्वयं, qpntEvent): प्रिंट dir (स्वयं) QGraphicsView.paintEvent (स्वयं, qpntEvent) – user192127

10

यह एक समय हो गया है, लेकिन मुझे लगता है कि मैं एक जवाब मिल गया है हो सकता है। जब आप एक विधि को सजाने एक classmethod मूल अनबाउंड विधि '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') 
+1

नोट: यह दृष्टिकोण पुरानी शैली कक्षाओं जहां सुपर() '__func__' रूप –

+1

भी उपलब्ध काम नहीं करता है के लिए काम करता है पायथन 2.7 और 3 में – dtheodor