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.
Il y a deux erreurs ici:
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.
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()
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()
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()