Урок 66 — Старый vs Новый: Основы ООП
⚡ Кратко
Источник показывает классический подход: класс + __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__ |
| Совместимость | Любая версия Python | Python 3.7+ для dataclasses |