Si j'ai une classe python comme:
class BaseClass(object):
#code and the init function of the base class
Et puis je définis une classe enfant telle que:
class ChildClass(BaseClass):
#here I want to call the init function of the base class
Si la fonction init de la classe de base prend des arguments que je prends comme arguments de la fonction init de la classe enfant, comment puis-je passer ces arguments à la classe de base?
Le code que j'ai écrit est:
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)
Où vais-je mal?
Vous pouvez utiliser 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)
Votre indentation est incorrecte, voici le code modifié:
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__
Voici la sortie:
{'color': 'golden', 'mpg': 10, 'model': 'ford', 'battery_type': 'battery'}
Comme Mingyu l'a fait remarquer, le formatage pose problème. Autre que cela, je recommanderais fortement de ne pas utiliser le nom de la classe dérivée lors de l'appel de super()
, car cela rend votre code inflexible (maintenance et héritage du code). problèmes). Dans Python 3, utilisez plutôt super().__init__
. Voici le code après avoir incorporé ces modifications:
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)
Merci à Erwin Mayer pour avoir signalé le problème lié à l'utilisation de __class__
avec super ()
Vous pouvez appeler le constructeur de la classe comme ça
class A(object):
def __init__(self, number):
print "parent", number
class B(A):
def __init__(self):
super(B, self).__init__(5)
b = B()
NOTE:
Cela ne fonctionnera que lorsque la classe parent héritera de object
Si vous utilisez Python 3, il est recommandé d'appeler simplement super () sans aucun argument:
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__
N'appelez pas super avec class , car cela pourrait entraîner des exceptions de récursion infinies conformément à cette réponse .