Задать вопрос
@steel_dog

Python ошибка в классе! понять пожалуйста?

Привет!
Решил выучить Python и первой книгой решил взять: ЭрикМатиз Изучаем Python: 3 издание.
Не думал что в книге об изучении программирования могут быть ошибки(опечатки) что дальше код не будет работать.
То есть я сижу все читаю и пытаюсь разобраться - в книге работает у меня нет!
Я подумал что в книге опечатка.
Но так как хочется разобратся в этой задаче.
Решил написать этот пост.

И так страница 175:
Работа с классами и экземплярами

Все работало пока на странице 184
В таком случае можно остановиться и переместить все эти атрибуты и методы в отдельный класс с именем Battery.

я создал новый класс Battery
и хочу выполнить:
"Когда потребуется вывести описание аккумулятора, необходимо обратиться к атрибуту battery:"
my_tesla.battery.describe_battery()
но python выводит ошибку:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-38-4226cc60aa32> in <module>
     77 
     78 #Мне нужно вывести:
---> 79 my_tesla.battery.describe_battery()

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


И я не понимаю действительно откуда взять - 'battery' ???
Но в книге ошибки нет и у них все работает.

"""
Напишем класс, представляющий автомобиль.
Этот класс будет содержать информацию о типе машины,
а также метод для вывода краткого описания:
"""
class Car():
    """Простая модель автомобиля."""
    
    def __init__(self, make, model, year):
        """Инициализирует атрибуты описания автомобиля."""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 23
        
    def get_descriptive_name(self):
        """Возвращает аккуратно отформатированное описание."""
        long_name = f"{self.year} {self.make} {self.model}"
        return long_name.title()
    
    def read_odometer(self):
        """Вывод пробег машины в милях"""
        print(f"This car has {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 back an odometer!")
            
    def increment_odometer(self, miles):
        """Увеличивает показания одометра с заданным приращением."""
        self.odometer_reading += miles
    
my_new_car = Car('audi', 'a4', 2019 )
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(24)
my_new_car.read_odometer()

my_used_car = Car('subaru', 'outback', 2015)
print(my_used_car.get_descriptive_name())

my_used_car.update_odometer(23_500)
my_used_car.read_odometer()

my_used_car.increment_odometer(100)
my_used_car.read_odometer()


class Battery():
    """Простая модель аккумулятора электромобиля."""
    
    def __init__(self, battery_size=75):
        """Инициализирует атрибуты аккумулятора."""
        self.battery_size = battery_size
        
    def describe_battery(self):
        """Выводит информацию о мощности аккумулятора."""
        print(f"This car has a {self.battery_size}--kWh battery.")

class ElectricCar(Car):
    """Представляет аспекты машины, специфические для электромобилей."""
    
    def __init__(self, make, model, year):
        """Инициализирует атрибуты класса-родителя.
        Затем инициализирует атрибуты, специфические для электромобиля."""
        super().__init__(make, model, year)
        self.battery_size = Battery()
        
            
my_tesla = ElectricCar('tesla', 'model s', 2019)
print(my_tesla.get_descriptive_name())

#Мне нужно вывести:
my_tesla.battery.describe_battery()

#Эта строка приказывает Python обратиться к экземпляру my_tesla, найти его атрибут battery и вызвать метод describe_battery(), связанный с экземпляром Battery из атрибута.
  • Вопрос задан
  • 314 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@javedimka
Хочу сока
Вот ты изучаешь книгу, а не просто пишешь код, так? Полагаю атрибуты класса ты уже прошёл и знаешь где они объявляются? Если так, то почему спрашиваешь в чем ошибка? Она же очевидна, в твоём варианте обращаться нужно к battery_size, а не просто к battery. И судя по вопросу тебе это понятно.
Вопрос об ошибке в книжке? По первой ссылке в гугле - в этой книге ошибки нет, там все написано корректно, вероятно ты неправильно списал.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
self.battery_size = Battery()
на
self.battery = Battery()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы