2 votes

L'objet 'child class' n'a pas d'attribut 'attribute_name'.

Je ne peux pas récupérer la valeur d'une variable créée uniquement par la classe enfant héritée. De même, la modification de la valeur d'une variable héritée de la classe parent dans le init de la classe enfant ne s'applique pas.

Voici la classe parentale :

class Car():

    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def __str__(self):
        return str(self.__class__) + ": " + str(self.__dict__)

    def get_descriptive_name(self):
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name.title()

    def read_odometer(self):
        print("This car has " + str(self.odometer_reading) + " miles on it.")

    def update_odometer(self, mileage):
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")

    def increment_odometer(self, miles):
        self.odometer_reading += miles

Et voici la classe enfant :

class ElectricCar(Car):

    def __init___(self, make, model, year):
        super(ElectricCar, self).__init__(make, model, year)
        self.odometer_reading = 100
        self.battery_size = 70

    def __str__(self):
        return str(self.__class__) + ": " + str(self.__dict__)

    def describe_battery(self):
        print(self.battery_size)

Maintenant, si j'essaie d'exécuter ce code :

my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla)
print(my_tesla.describe_battery())

J'obtiens l'exception suivante :

<class '__main__.ElectricCar'>:
{'make': 'tesla', 'model': 'model s', 'year': 2016, 'odometer_reading': 0}

AttributeError: 'ElectricCar' object has no attribute 'battery_size'

J'ai une variable oddmeter_reading dont la valeur est 0 dans la classe parent. J'ai changé la valeur de la classe enfant pour 100, mais cela ne s'est pas appliqué. De plus, la variable battery_size qui n'est défini que dans la classe enfant, n'est pas créé dans init.

Quel est le problème ? Qu'est-ce qui me manque ?

1voto

Il y a une faute de frappe dans votre ElectricCar classe. Vous avez défini la méthode __init___ avec trois caractères de soulignement au lieu de deux, afin qu'il ne soit pas appelé lorsque vous créez une nouvelle instance.

Si vous changez votre ElectricCar à cette classe :

class ElectricCar(Car):

    def __init__(self, make, model, year): #Note the two underscores
        super(ElectricCar, self).__init__(make, model, year)
        self.odometer_reading = 100
        self.battery_size = 70

    def __str__(self):
        return str(self.__class__) + ": " + str(self.__dict__)

    def describe_battery(self):
        print(self.battery_size)

alors ceci sera le résultat :

<class '__main__.ElectricCar'>: {'make': 'tesla', 'model': 'model s', 'year': 2016, 
'odometer_reading': 100, 'battery_size': 70}
70
None

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X