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

Всё в Python — объект

У каждого значения есть тип — класс, который определяет, что значение умеет. type, isinstance и методы строк и списков как поведение объекта.

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

Объектно-ориентированное программирование (ООП) начинается не со своих классов, а с того, что вы уже знаете. Число 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. Методы другого класса у объекта не появятся:

[ ]У строки нет appendошибка: AttributeError
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
[ ]Упражнение 1Что лежит в списке решено

В списке values — значения разных типов. Сохраните в kinds список имён их классов по порядку: ["int", "str", …].

values = [150, "латте", 2.5, ["чай"], {"раф": 260}, True]
kinds = ...

Проверка типа: isinstance

Чтобы проверить, экземпляр ли значение нужного класса, есть isinstance(значение, класс): он возвращает True или False. Вторым аргументом можно передать кортеж классов — тогда подходит любой из них:

[ ]isinstance с одним классом и с кортежем
print(isinstance(150, int))
print(isinstance("150", int))
print(isinstance(2.5, (int, float)))
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
True
False
True
[ ]Упражнение 2Только числа решено

В список raw попали цены из разных источников: числа вперемешку со строками и None. Сохраните в prices только числа — и целые, и дробные, — в том же порядке.

raw = [150, "200", 90.5, None, 120, "нет цены", 300.0]
prices = ...

Вопрос

Что вернёт isinstance(True, int)?

Классы — тоже объекты

Раз всё в 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']
[ ]Упражнение 3Описание значения решено

Напишите функцию describe(value), которая возвращает строку вида "int: 150" — имя класса значения, двоеточие и само значение. Например, describe("латте") — это "str: латте".

def describe(value):
    ...  # "имя класса: значение"

Итак, у любого значения есть класс, а класс задаёт данные и поведение его экземпляров. В следующем уроке вы объявите свой первый класс — для товара кофейни.

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