it-swarm.com.de

Die Super __init__-Vererbung von Python 2.x funktioniert nicht, wenn das übergeordnete Objekt nicht vom Objekt erbt

Ich habe den folgenden Python 2.7-Code:

class Frame:
    def __init__(self, image):
        self.image = image

class Eye(Frame):
    def __init__(self, image):
        super(Eye, self).__init__()
        self.some_other_defined_stuff()

Ich versuche, die __init__()-Methode so zu erweitern, dass, wenn ich ein 'Auge' instanziiere, ein paar andere Sachen (self.some_other_defined_stuff ()) zusätzlich zu dem, was Frame einrichtet, erstellt wird. Frame.__init__() muss zuerst ausgeführt werden.

Ich erhalte folgende Fehlermeldung:

super(Eye, self).__init__()
TypeError: must be type, not classobj

Die ich die logische Ursache nicht verstehe. Kann mir jemand bitte erklären? Ich bin es gewohnt, einfach in Ruby "super" einzugeben.

23
cjm2671

Hier gibt es zwei Fehler:

  1. super() funktioniert nur für Klassen im neuen Stil ; Verwenden Sie object als Basisklasse für Frame, damit die Semantik im neuen Stil verwendet wird.

  2. Sie müssen immer noch die überschriebene Methode mit den richtigen Argumenten aufrufen. Übergeben Sie in image den Aufruf __init__.

Der korrekte Code wäre also:

class Frame(object):
    def __init__(self, image):
        self.image = image

class Eye(Frame):
    def __init__(self, image):
        super(Eye, self).__init__(image)
        self.some_other_defined_stuff()
43
Martijn Pieters

Frame muss object erweitern, da nur die neuen Stilklassen super-Aufruf unterstützen, den Sie in Eye wie folgt machen:

class Frame(object):
    def __init__(self, image):
        self.image = image

class Eye(Frame):
    def __init__(self, image):
        super(Eye, self).__init__(image)
        self.some_other_defined_stuff()
12
myusuf3

Bitte schreiben Sie: __metaclass__ = type am Anfang des Codes, dann können wir auf die Superklasse zugreifen

__metaclass__ = type
class Vehicle:
                def start(self):
                                print("Starting engine")
                def stop(self):
                                print("Stopping engine")                            
class TwoWheeler(Vehicle):
                def say(self):
                    super(TwoWheeler,self).start()
                    print("I have two wheels")
                    super(TwoWheeler,self).stop()                            
Pulsar=TwoWheeler()
Pulsar.say()
0
ashwin r