Встроенных классов — int, str, list — не хватит, чтобы описать кофейню: нет класса «товар», «заказ»
или «карта лояльности». Такие классы объявляют сами.
Объявление класса
Класс объявляется словом class, за ним — имя и двоеточие, ниже с отступом — тело класса. Имена классов
пишут с большой буквы, слова — слитно: Product, LoyaltyCard. Пока тело пустое, в нём пишут pass —
«ничего не делать»:
class Product:
pass
print(Product.__name__)
print(type(Product).__name__)Product type
Чтобы создать экземпляр класса, класс вызывают, как функцию: Product(). Каждый вызов создаёт
новый объект. type и isinstance работают с вашим классом так же, как со встроенными:
first = Product()
second = Product()
print(type(first).__name__)
print(isinstance(first, Product))
print(first == second) # два разных объектаProduct True False
Объявите пустой класс Drink и создайте его экземпляр espresso.
class Drink: и с отступом pass; экземпляр — Drink().Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
# объявите класс Drink
espresso = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
class Drink:
pass
espresso = Drink()Атрибуты экземпляра
У экземпляра могут быть атрибуты (attribute) — переменные, которые живут внутри объекта. Записывают и
читают их через точку: cup.name = "Латте", print(cup.name). У каждого экземпляра атрибуты свои:
cup = Product()
cup.name = "Латте"
cup.price = 220
other = Product()
other.name = "Чай"
other.price = 120
print(cup.name, cup.price)
print(other.name, other.price)
print(cup.price + other.price)Латте 220 Чай 120 340
Создайте экземпляр latte класса Drink с атрибутами name — "Латте", price — 220 и volume — 300.
latte = Drink(), затем три строки вида latte.price = 220.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
latte = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
latte = Drink()
latte.name = "Латте"
latte.price = 220
latte.volume = 300С атрибутами экземпляр работает как обычное значение: их складывают, сравнивают, передают в функции.
Создайте два экземпляра Drink: small с атрибутами name = "Капучино", price = 180 и large
с name = "Капучино", price = 240. Сохраните в diff, на сколько большой дороже маленького.
large.price - small.price.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
small = ...
large = ...
diff = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
small = Drink()
small.name = "Капучино"
small.price = 180
large = Drink()
large.name = "Капучино"
large.price = 240
diff = large.price - small.priceПочему так неудобно
Записывать атрибуты снаружи можно, но легко ошибиться. Забыли строчку — атрибута у объекта нет, и программа упадёт там, где его прочитают:
tea = Drink()
tea.name = "Чай"
print(tea.price)AttributeError: 'Drink' object has no attribute 'price'
А опечатка ещё хуже: Python молча создаст новый атрибут, и старое значение останется прежним:
tea.price = 120
tea.prise = 130 # опечатка
print(tea.price)
print(tea.prise)120 130
Пока придётся следить самим. Например, вынести создание объекта в функцию — тогда атрибуты задаются в одном месте и одинаково для всех объектов.
Напишите функцию make_drink(name, price): она создаёт экземпляр Drink, записывает в него атрибуты
name и price из аргументов и возвращает его.
drink = Drink(), две строки с атрибутами и return drink.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
def make_drink(name, price):
... # создайте Drink, запишите атрибуты и верните егоУпражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
def make_drink(name, price):
drink = Drink()
drink.name = name
drink.price = price
return drinkФункция-фабрика помогает, но она живёт отдельно от класса: про неё можно забыть и снова создать объект
без атрибутов. В Python для этого есть место внутри самого класса — метод __init__. О нём — следующий урок.