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í:
- ¿Cómo invocar al súper constructor? 5 respuestas
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 .