J'ai une instance d'une classe de base, puis je veux en faire une instance d'une classe enfant de cette classe de base. Peut-être que je prends le problème dans un mauvais sens et qu'il y a quelque chose d'important que je n'ai pas compris dans OOP. Le code est seulement là pour illustrer et une approche très différente peut être suggérée. Toute aide appréciée.Héritage: transforme une instance de classe de base en instance de classe enfant
class Car(object):
def __init__(self, color):
self.color = color
def drive(self):
print "Driving at 50 mph"
class FastCar(Car):
def __init__(self, color, max_speed=100):
Car.__init__(self, color)
self.max_speed = max_speed
def drive_fast(self):
print "Driving at %s mph" %self.max_speed
one_car = Car('blue')
# After the instanciation, I discovered that one_car is not just a classic car
# but also a fast one which can drive at 120 mph.
# So I want to make one_car a FastCar instance.
Je vois une question très similaire, mais aucune des réponses convient à mon problème:
Je ne veux pas faire FastCar une enveloppe autour de voiture qui saura comment rouler vite: Je veux vraiment que FastCar prolonge la voiture;
Je ne veux pas vraiment utiliser la méthode
__new__
dans FastCar de faire quelques tests sur les arguments et décider si__new__
doit retourner une nouvelle instance de voiture ou l'instance que je lui donna (exemple:def __new__(cls, color, max_speed=100, baseclassinstance=None)
).
Pourquoi ne pas le faire: one_car = FastCar (one_car.color, 120)? Ce n'est pas vraiment l'héritage ou quoi que ce soit mais devrait fonctionner. – Bogdan
Votre conception de POO semble un peu éteinte. J'imagine que FastCar implémenterait aussi drive(), mais le ferait à la vitesse supérieure (ce que vous avez implémenté comme drive_fast). Avec ce que vous avez maintenant, l'appelant doit connaître le type pour savoir quelle méthode appeler (mauvais), au lieu d'appeler la même méthode et avoir les différents types implémenter cette méthode comme approprié (bon). Vous pouvez également le faire en ajoutant 'drive = drive_fast' à la fin de la classe FastCar. – PaulMcG
Ok.Un meilleur exemple: 'FastCar' n'a pas de méthode' drive_fast' mais une méthode 'overtake', qui n'existe pas pour' Car'. – Andy