tutorial method classes python python-2.7 inheritance constructor

method - super class python 3



¿Cómo llamar al método__init__ de Base Class desde la clase secundaria? (4)

Esta pregunta ya tiene una respuesta aquí:

Si tengo una clase de Python como:

class BaseClass(object): #code and the init function of the base class

Y luego defino una clase infantil como:

class ChildClass(BaseClass): #here I want to call the init function of the base class

Si la función init de la clase base toma algunos argumentos de que los estoy tomando como argumentos de la función init de la clase secundaria, ¿cómo transfiero estos argumentos a la clase base?

El código que he escrito es:

class Car(object): condition = "new" def __init__(self, model, color, mpg): self.model = model self.color = color self.mpg = mpg class ElectricCar(Car): def __init__(self, battery_type, model, color, mpg): self.battery_type=battery_type super(ElectricCar, self).__init__(model, color, mpg)

¿Dónde estoy equivocado?


Como señaló Mingyu, hay un problema en el formateo. Aparte de eso, recomiendo encarecidamente no usar el nombre de la clase derivada al llamar a super() ya que hace que el código sea inflexible (mantenimiento de código y problemas de herencia). En Python 3, use super().__init__ en super().__init__ lugar. Aquí está el código después de incorporar estos cambios:

class Car(object): condition = "new" def __init__(self, model, color, mpg): self.model = model self.color = color self.mpg = mpg class ElectricCar(Car): def __init__(self, battery_type, model, color, mpg): self.battery_type=battery_type super().__init__(model, color, mpg)

Gracias a Erwin Mayer por señalar el problema al usar __class__ con super ()


Podría usar super(ChildClass, self).__init__()

class BaseClass(object): def __init__(self, *args, **kwargs): pass class ChildClass(BaseClass): def __init__(self, *args, **kwargs): super(ChildClass, self).__init__(*args, **kwargs)

Su sangría es incorrecta, aquí está el código modificado:

class Car(object): condition = "new" def __init__(self, model, color, mpg): self.model = model self.color = color self.mpg = mpg class ElectricCar(Car): def __init__(self, battery_type, model, color, mpg): self.battery_type=battery_type super(ElectricCar, self).__init__(model, color, mpg) car = ElectricCar(''battery'', ''ford'', ''golden'', 10) print car.__dict__

Aquí está el resultado:

{''color'': ''golden'', ''mpg'': 10, ''model'': ''ford'', ''battery_type'': ''battery''}


Puedes llamar al constructor de la superclase como este

class A(object): def __init__(self, number): print "parent", number class B(A): def __init__(self): super(B, self).__init__(5) b = B()

NOTA:

Esto funcionará solo cuando la clase padre hereda el object


Si está utilizando Python 3, se recomienda simplemente llamar a super () sin ningún argumento:

class Car(object): condition = "new" def __init__(self, model, color, mpg): self.model = model self.color = color self.mpg = mpg class ElectricCar(Car): def __init__(self, battery_type, model, color, mpg): self.battery_type=battery_type super().__init__(model, color, mpg) car = ElectricCar(''battery'', ''ford'', ''golden'', 10) print car.__dict__

No llame a super con clase, ya que puede dar lugar a infinitas excepciones de recursión según esta respuesta .