La herencia de Python 2.x super __init__ no funciona cuando el padre no hereda del objeto

Tengo el siguiente código de Python 2.7:

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

Estoy tratando de extender el __init__() para que cuando cree un “Ojo” haga un montón de otras cosas (self.some_other_defined_stuff ()), además de lo que Frame configura. Frame.__init__() debe ejecutarse primero.

Obtuve el siguiente error:

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

Que no entiendo la causa lógica de. ¿Alguien puede explicar por favor? Estoy acostumbrado a escribir ‘super’ en ruby.

Hay dos errores aquí:

  1. super() solo funciona para clases de nuevo estilo ; use el object como clase base para Frame para que use la semántica de estilo nuevo.

  2. Aún debe llamar al método anulado con los argumentos correctos; pasar la image a la llamada __init__ .

Entonces el código correcto sería:

 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 debe extender el object porque solo las nuevas clases de estilo admiten la super llamada que haces en Eye por lo que:

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

Por favor escriba: __metaclass__ = type en la parte superior del código y luego podremos acceder a la súper clase

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

Hola ver mis códigos de trabajo para python 2.7

 __metaclass__ = type class Person: def __init__(self, first, last, age): self.firstname = first self.lastname = last self.age = age def __str__(self): return self.firstname + " " + self.lastname + ", " + str(self.age) class Employee(Person): def __init__(self, first, last, age, staffnum): super(Employee, self).__init__(first, last, age) self.staffnumber = staffnum def __str__(self): return super(Employee, self).__str__() + ", " + self.staffnumber x = Person("Marge", "Simpson", 36) y = Employee("Homer", "Simpson", 28, "1007") print(x) print(y)