Объект «дочерний класс» не имеет атрибута «attribute_name» - PullRequest
0 голосов
/ 10 ноября 2018

Я не могу получить значение переменной, созданной только унаследованным дочерним классом. Кроме того, изменение значения переменной, унаследованной от родительского класса в инициализации дочернего класса, не применяется.

Вот родительский класс:

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

А вот и дочерний класс:

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)

Теперь, если я попытаюсь запустить этот код:

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

Я получаю следующее исключение:

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

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

У меня есть переменная oddmeter_reading, значение которой равно 0 в родительском классе. Я перешел с детского класса на 100, но это не применимо. Кроме того, переменная battery_size, заданная только в дочернем классе, не создается в init.

В чем проблема? Чего мне не хватает?

1 Ответ

0 голосов
/ 18 ноября 2018

В вашем классе ElectricCar есть опечатка. Вы определили метод __init___ с тремя подчеркиваниями вместо двух, поэтому он не вызывается при создании нового экземпляра.

Если вы измените свой класс ElectricCar на этот:

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)

тогда это будет вывод:

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