Классы в Python: первый объект
Класс — чертёж, объект — экземпляр по этому чертежу. Создаём первый класс, вызываем методы и убеждаемся: в Python объектом является всё, включая функции.
Редакция Питоники
До сих пор вы пользовались чужими классами: каждая строка в Python — объект класса str, каждый список — list, а методы вроде upper() и append() принадлежат именно классам. Теперь вы переходите на другую сторону баррикад: начнёте проектировать собственные классы — способ завести в программе собственные сущности вроде дома, банковского счёта или игрока. После следующего урока объекты научатся рождаться с готовым состоянием, а пока — класс, объект и первая проверка того, из чего состоит Python.
Класс и объект: чертёж и экземпляр
class Robot:
def say_hello(self):
print("Бип-бип!")
first = Robot()
second = Robot()
first.say_hello()
print(first is second)
Бип-бип! False
class Robot:
def say_hello(self):
print(f"Привет, я {self.name}!")
first = Robot()
first.name = "Роби"
second = Robot()
second.name = "Валли"
first.say_hello()
second.say_hello()
print(second.name)
Привет, я Роби! Привет, я Валли! Валли
Класс — чертёж: он описывает, какие атрибуты (данные) и методы (поведение) будут у будущих объектов, но сам по себе ничего не хранит. Объект, он же экземпляр, — живой представитель, построенный по чертежу вызовом класса. Из одного класса рождается сколько угодно независимых объектов, и у каждого своё состояние. Вызов Robot() строит новый объект; дважды — значит два объекта, и first is second честно отвечает False: это разные жители класса. Запись first.name = "Роби" прикрепляет к объекту атрибут — данные, которые живут при конкретном роботе; у second имя своё, поэтому роботы здороваются по-разному. Синтаксис одинаков для чтения и записи: obj.имя, — а класс остаётся единственным описанием поведения.
Всё в Python — объект
Классы — не особый мир внутри языка, а его обычная ткань. Строка, число, список, функция — всё это объекты своих классов, и у любого можно спросить тип функцией type(). Дойдёт до забавного: сам класс — тоже объект, экземпляр класса type. Именно поэтому Python ведёт себя единообразно: у любого значения есть тип, методы и место в памяти.
class Cat:
pass
print(type("abc"))
print(type(42))
print(type([1, 2]))
print(type(Cat))
murzik = Cat()
print(type(murzik))
<class 'str'> <class 'int'> <class 'list'> <class 'type'> <class '__main__.Cat'>
| Выражение | Результат | Что это значит |
|---|---|---|
| type("abc") | <class 'str'> | строка — объект встроенного класса str |
| type(42) | <class 'int'> | целое число — объект класса int |
| type(murzik) | <class '__main__.Cat'> | экземпляр — объект вашего класса |
| type(Cat) | <class 'type'> | сам класс — тоже объект, экземпляр type |
Первый класс создан, объекты размножены, и вы знаете, что type("abc") — это <class 'str'>. Дальше по курсу: __init__ и self — как объект получает состояние при рождении; атрибуты класса и экземпляра — общее против индивидуального. А когда объекты начнут печататься уродливыми адресами, их принарядят магические методы.
Сначала предскажи ответ в голове — это главный навык программиста.
class House:
def live(self):
print("живём")
h1 = House()
h2 = House()
print(h1 is h2)
class Book:
def describe(self):
print(f"Книга: {self.title}")
book = Book()
book.title = "Алиса"
book.describe()
class Game:
pass
print(type(Game))
1. Что такое класс в Python?
2. Как создать экземпляр класса House?
3. Что выведет type("питон")?
4. first = Robot() и second = Robot(). Что вернёт first is second?
5. Что напечатает print(cat), если у класса Cat нет __repr__ и __str__?
6. Почему upper() можно вызвать у строки, но не у числа?
Создайте класс Book с методом describe(self), который печатает строку вида «Книга: Название, страниц: N». Создайте два объекта: book_one с атрибутами title = "Муми-тролли" и pages = 200, book_two с title = "Винни-Пух" и pages = 150. Вызовите describe у обеих книг.
Что такое класс в Python простыми словами?
Это чертёж: класс перечисляет, какие данные и методы будут у объектов. Сам класс данных не хранит — хранят созданные по нему экземпляры. Вызов класса со скобками, House(), строит новый объект.
Урок 2: __init__ и selfЧем класс отличается от объекта?
Класс один, объектов по нему — сколько угодно. Класс House описывает, что у дома есть адрес и этажи; объекты my_house и dacha — конкретные дома с разными значениями атрибутов. Класс — это тип, объект — экземпляр типа.
Почему в Python всё является объектом?
Потому что даже базовые значения — экземпляры классов: строка — str, число — int, функция — function. Проверка type(42) вернёт <class 'int'>. Единообразие даёт каждому значению тип и методы, поэтому код вроде "текст".upper() работает без деления типов на простые и сложные.
Что означает <class '__main__.Cat'> в выводе type()?
__main__ — имя модуля, в котором класс объявлен (при запуске файла напрямую модуль называется __main__), а Cat — имя класса. Для экземпляра type(murzik) покажет именно его класс; адреса памяти в этом выводе нет — он появляется только при печати самого объекта без __repr__.
Понравился урок? Сошлитесь на него
«Из одного класса рождается сколько угодно независимых объектов, и у каждого своё состояние.»
Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.
Что читать дальше
ООП · Урок 2
__init__ и self: как рождается объект
__init__ задаёт объекту стартовое состояние, а self — это сам объект внутри его методов. Разбираем механику вызова hero.heal(30) до последней детали.
ООП · Урок 3
Атрибуты класса и атрибуты экземпляра
Атрибут класса один на всех, атрибут экземпляра — личный. Разбираем порядок поиска атрибутов и классическую ловушку общего списка — с исправлением.
ООП · Урок 11
Магические методы: __str__ и __repr__
print(obj) без подготовки показывает тип и адрес в памяти. Магические методы __str__ и __repr__ позволяют самим решить, как объект превращается в строку, — человек увидит «21°C», а отладчик — Temperature(21).
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
re · Урок 1
Регулярные выражения Python с нуля: первый шаблон и модуль re
Первый шаблон, который находит любую дату в тексте, а не одну конкретную: import re, re.search, raw-строки и объект Match — всё, чтобы перестать бояться регулярки.
объект match pythonрегулярки для начинающих
pytest · Урок 1
Первый тест на pytest: assert, запуск и первый отчёт
Первая тест-функция на обычном assert: pytest сам находит её, запускает и печатает отчёт — точка, 1 passed и код выхода 0. Всё прямо в браузере.
pytest первый тестpytest для начинающих
ООП · Урок 7
Наследование: расширяем классы
Наследование — способ расширять классы без переписывания: потомок получает всё от родителя, переопределяет и дополняет через super(). Родство проверяет isinstance.
родительский класс pythonдочерний класс python