Привет!
Решил выучить 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 из атрибута.