Объектно-ориентированное программирование (ООП) начинается не со своих классов, а с того, что вы уже знаете.
Число 150, строка "латте", список заказов, словарь меню — всё это объекты (object). У каждого
объекта есть тип, и тип определяет, что объект умеет.
Тип объекта
Встроенная функция type возвращает тип значения. В выводе тип выглядит как <class 'int'>: тип
в Python и есть класс (class), а само значение — экземпляр (instance) этого класса. 150 — экземпляр
класса int, "латте" — экземпляр класса str.
print(type(150))
print(type(2.5))
print(type("латте"))
print(type(["чай", "раф"]))
print(type({"чай": 120}))<class 'int'> <class 'float'> <class 'str'> <class 'list'> <class 'dict'>
Классы — это «чертежи», а экземпляры — сделанные по ним вещи. Экземпляров одного класса может быть сколько
угодно: 150, 220 и -3 — разные экземпляры int, но устроены одинаково.
Тип определяет поведение
Объект — это не только данные, но и поведение: что с ним можно сделать. Поведение записано в классе
в виде методов (method) — функций, которые вызываются через точку. У строки есть upper и split,
у списка — append и sort:
name = "латте"
print(name.upper())
print("чай, раф, какао".split(", "))
order = ["чай", "раф"]
order.append("какао")
print(order)ЛАТТЕ ['чай', 'раф', 'какао'] ['чай', 'раф', 'какао']
Метод берёт данные у того объекта, у которого его вызвали: "латте".upper() работает со строкой
"латте", а order.append(...) меняет именно список order. Методы другого класса у объекта не появятся:
name.append("со льдом")AttributeError: 'str' object has no attribute 'append'
Имя класса
У класса есть атрибут __name__ — его имя строкой. type(value).__name__ удобно печатать в сообщениях:
это короче, чем <class 'int'>.
price = 220
print(type(price).__name__)
print(f"price — это {type(price).__name__}")int price — это int
В списке values — значения разных типов. Сохраните в kinds список имён их классов по порядку:
["int", "str", …].
type(v).__name__; для всех — генератор списка.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
values = [150, "латте", 2.5, ["чай"], {"раф": 260}, True]
kinds = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
values = [150, "латте", 2.5, ["чай"], {"раф": 260}, True]
kinds = [type(v).__name__ for v in values]Проверка типа: isinstance
Чтобы проверить, экземпляр ли значение нужного класса, есть isinstance(значение, класс): он возвращает
True или False. Вторым аргументом можно передать кортеж классов — тогда подходит любой из них:
print(isinstance(150, int))
print(isinstance("150", int))
print(isinstance(2.5, (int, float)))True False True
В список raw попали цены из разных источников: числа вперемешку со строками и None. Сохраните в prices
только числа — и целые, и дробные, — в том же порядке.
isinstance(v, (int, float)) — True для целых и дробных чисел.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
raw = [150, "200", 90.5, None, 120, "нет цены", 300.0]
prices = ...Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
raw = [150, "200", 90.5, None, 120, "нет цены", 300.0]
prices = [v for v in raw if isinstance(v, (int, float))]Что вернёт isinstance(True, int)?
bool построен на основе int: True ведёт себя как 1, а False — как 0, поэтому True + True равно 2. Для isinstance логическое значение — тоже целое число. Как один класс строится на основе другого, разберём в модуле о наследовании.Классы — тоже объекты
Раз всё в Python — объект, то и сам класс — объект. Его можно положить в переменную или список, передать
в функцию. А раз класс — объект, у него тоже есть тип: классы — экземпляры класса type, поэтому
type(int) — это type:
kind = int
print(kind("42") + 1)
print(type(int))
print([c.__name__ for c in [int, str, list]])43 <class 'type'> ['int', 'str', 'list']
Напишите функцию describe(value), которая возвращает строку вида "int: 150" — имя класса значения,
двоеточие и само значение. Например, describe("латте") — это "str: латте".
type(value).__name__; строку удобно собрать f-строкой.Заготовка упражнения обновилась с тех пор, как вы сохранили свой код.
Вернуть заготовку? Ваш код в этом упражнении будет удалён.
def describe(value):
... # "имя класса: значение"Упражнение пока не решено, поэтому для ячеек ниже выполнено эталонное решение — ваш код не изменён.
def describe(value):
return f"{type(value).__name__}: {value}"Итак, у любого значения есть класс, а класс задаёт данные и поведение его экземпляров. В следующем уроке вы объявите свой первый класс — для товара кофейни.