Глава 14 · Создаём объекты реального мира

Класс или не класс? Проектируем модели

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

Не каждая задача требует класса

После 24 разделов про классы легко решить, что классом нужно оборачивать вообще всё. Это не так — класс полезен, когда есть И состояние, И поведение, которые имеет смысл держать вместе, и когда объектов этого вида будет несколько, с независимой историей.

Класс или не класс?
Нужно и хранить данные, и выполнять над ними действия?
→ вероятно, класс
Будет несколько независимых экземпляров с разным состоянием?
→ класс
Это разовое вычисление без хранимого состояния?
→ обычная функция
Данные без всякого поведения, читаются один раз?
→ dict / tuple / dataclass без методов
Нужна проверка при изменении значения?
→ property (раздел 14.11)
Debug Lab 14: класс ради одного вычисления без состояния
izlishnij_klass.py
class SredneeArifmeticheskoe:
    def __init__(self, chisla):
        self.chisla = chisla

    def vychislit(self):
        return sum(self.chisla) / len(self.chisla)

rezultat = SredneeArifmeticheskoe([4, 8, 15]).vychislit()
# Код работает правильно — ошибка не во время выполнения,
# а в самом ДИЗАЙНЕ: слишком много церемоний для одного вычисления
Что видно на экране

Формально это рабочий код, но здесь нет ни настоящего состояния (объект создаётся и сразу используется один раз), ни нескольких экземпляров — просто вычисление, притворяющееся классом. Обычная функция читается и тестируется проще: srednee(chisla). Класс оправдан, когда объект живёт какое-то время И меняет состояние — как Player из раздела 14.9, а не когда он существует одну строчку.

Исправленный код
prostaya_funkciya.py
def srednee_arifmeticheskoe(chisla):
    return sum(chisla) / len(chisla)

rezultat = srednee_arifmeticheskoe([4, 8, 15])
Признаки, что классу самое место
Объект несколько раз меняет состояние ПОСЛЕ создания (не только при __init__); в программе будет больше одного такого объекта одновременно; данные и действия над ними логически связаны настолько, что разделять их неудобно. Если ни один признак не выполняется — начните с функции или словаря, класс всегда можно добавить позже, когда он реально понадобится.
★★ Самостоятельная задача
Функция или класс?

Для каждого сценария решите, что уместнее — функция или класс, и обоснуйте: (1) перевод температуры из Цельсия в Фаренгейт; (2) банковский счёт с балансом и историей операций; (3) проверка, является ли число простым.

Практика: класс или не класс
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →