Нашли ошибку?
Скачать чистый
урок 3 из 6≈ 15 минупражнения: 0 из 4

Первый класс

Объявить свой класс словом class, создать экземпляры вызовом класса и записать в них атрибуты — и понять, почему записывать атрибуты снаружи неудобно.

Python запустится при первом выполнении

Встроенных классов — int, str, list — не хватит, чтобы описать кофейню: нет класса «товар», «заказ» или «карта лояльности». Такие классы объявляют сами.

Объявление класса

Класс объявляется словом class, за ним — имя и двоеточие, ниже с отступом — тело класса. Имена классов пишут с большой буквы, слова — слитно: Product, LoyaltyCard. Пока тело пустое, в нём пишут pass — «ничего не делать»:

[ ]Пустой класс Product
class Product:
    pass


print(Product.__name__)
print(type(Product).__name__)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
Product
type

Чтобы создать экземпляр класса, класс вызывают, как функцию: Product(). Каждый вызов создаёт новый объект. type и isinstance работают с вашим классом так же, как со встроенными:

[ ]Два экземпляра Product
first = Product()
second = Product()
print(type(first).__name__)
print(isinstance(first, Product))
print(first == second)  # два разных объекта
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
Product
True
False
[ ]Упражнение 1Класс напитка решено

Объявите пустой класс Drink и создайте его экземпляр espresso.

# объявите класс Drink

espresso = ...

Атрибуты экземпляра

У экземпляра могут быть атрибуты (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
[ ]Упражнение 2Латте с атрибутами решено

Создайте экземпляр latte класса Drink с атрибутами name — "Латте", price — 220 и volume — 300.

latte = ...

С атрибутами экземпляр работает как обычное значение: их складывают, сравнивают, передают в функции.

[ ]Упражнение 3Маленький и большой решено

Создайте два экземпляра Drink: small с атрибутами name = "Капучино", price = 180 и large с name = "Капучино", price = 240. Сохраните в diff, на сколько большой дороже маленького.

small = ...
large = ...
diff = ...

Почему так неудобно

Записывать атрибуты снаружи можно, но легко ошибиться. Забыли строчку — атрибута у объекта нет, и программа упадёт там, где его прочитают:

[ ]Атрибут забыли записатьошибка: AttributeError
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

Пока придётся следить самим. Например, вынести создание объекта в функцию — тогда атрибуты задаются в одном месте и одинаково для всех объектов.

[ ]Упражнение 4Функция-фабрика решено

Напишите функцию make_drink(name, price): она создаёт экземпляр Drink, записывает в него атрибуты name и price из аргументов и возвращает его.

def make_drink(name, price):
    ...  # создайте Drink, запишите атрибуты и верните его

Функция-фабрика помогает, но она живёт отдельно от класса: про неё можно забыть и снова создать объект без атрибутов. В Python для этого есть место внутри самого класса — метод __init__. О нём — следующий урок.

Нашли ошибку?