Урок 66 — Старый vs Новый: Основы ООП

📁 Блок: Python Fundamentals / ООП ⏱️ Время изучения: ~20 мин 🎯 Сложность: Средняя
#class #pass #def #print #return

⚡ Кратко

Источник показывает классический подход: класс + __init__ + методы. В современном Python 3.x к нему добавляют аннотации типов, __repr__, __eq__ и dataclasses.

⚖️ Классический подход из источника

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

    def get_description(self):
        return f"{self.title} — {self.author}"


book = Book("1984", "George Orwell")
print(book.get_description())

Код рабочий и понятный, но не даёт информации о типах и печатает объекты неинформативно.

⚖️ Современный Python 3.x

from __future__ import annotations


class Book:
    def __init__(self, title: str, author: str) -> None:
        self.title = title
        self.author = author

    def __repr__(self) -> str:
        return f"Book(title={self.title!r}, author={self.author!r})"

    def get_description(self) -> str:
        return f"{self.title} — {self.author}"


book = Book("1984", "George Orwell")
print(book)             # Book(title='1984', author='George Orwell')
print(book.get_description())

Что улучшено

  • Аннотации типов — помогают IDE и статическим анализаторам (mypy) находить ошибки.
  • __repr__ — удобное строковое представление объекта при отладке.
  • PEP 8 — пробелы, именование, docstrings.

⚖️ dataclasses — ещё более современный вариант

from dataclasses import dataclass


@dataclass
class Book:
    title: str
    author: str

    def get_description(self) -> str:
        return f"{self.title} — {self.author}"


book = Book("1984", "George Orwell")
print(book)             # Book(title='1984', author='George Orwell')
print(book.get_description())

Декоратор @dataclass автоматически генерирует __init__, __repr__ и __eq__. Это уменьшает шаблонный код, когда класс в основном хранит данные.

Проверить по документации: dataclasses, аннотации типов и магические методы (__repr__, __eq__) выходят за рамки исходного материала урока. Перед применением в проекте рекомендуется свериться с официальной документацией Python.

⚖️ Сравнение подходов

АспектКлассический подходСовременный Python 3.x
ЧитаемостьВысокая для новичковВысокая, особенно в больших проектах
ТипобезопасностьНетАннотации + mypy
Шаблонный кодМного ручного __init__dataclasses сокращает boilerplate
Отладка<__main__.Book object>Человекочитаемый __repr__
СовместимостьЛюбая версия PythonPython 3.7+ для dataclasses