web-dev-qa-db-fra.com

L'héritage super __init__ de Python 2.x ne fonctionne pas lorsque le parent n'hérite pas d'un objet

J'ai le code Python 2.7 suivant:

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()

J'essaie d'étendre la méthode __init__() de sorte que, lorsque j'instancie un "œil", il effectue un tas d'autres opérations (self.some_other_defined_stuff ()), en plus de ce que Frame configure. Frame.__init__() doit être exécuté en premier.

Je reçois l'erreur suivante:

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

Ce que je ne comprends pas la cause logique de. Quelqu'un peut-il expliquer s'il vous plaît? Je suis habitué à taper "super" en Ruby.

23
cjm2671

Il y a deux erreurs ici:

  1. super() ne fonctionne que pour les classes de style nouveau ; utilisez object comme classe de base de Frame pour lui faire utiliser une sémantique de style nouveau.

  2. Vous devez toujours appeler la méthode remplacée avec les bons arguments. transmettez image à l'appel __init__.

Donc, le code correct serait:

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 doit étendre object car seules les nouvelles classes de style prennent en charge l'appel super que vous effectuez dans Eye comme ceci:

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

S'il vous plaît écrivez: __metaclass__ = type en haut du code alors nous pouvons accéder à la classe super

__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