Урок 66 — Ошибки: Основы ООП

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

⚡ Кратко

Главные ошибки новичков: пропуск self, передача self при вызове, путаница __init__ / __new__ и именование классов не в CamelCase.

🐛 Ошибка 1. Забыли self в методе

class Book:
    def __init__(title, author):  # ОШИБКА: пропущен self
        self.title = title
        self.author = author

Проблема: Python не сможет понять, к какому объекту относятся поля.

Исправление: первым параметром всегда пишите self.

🐛 Ошибка 2. Передача self при вызове метода

book = Book("1984", "George Orwell")
book.show_info(book)  # ОШИБКА: self передаётся автоматически

Проблема: при вызове через объект Python сам подставляет объект в self. Явная передача приведёт к лишнему аргументу.

Исправление: пишите book.show_info().

🐛 Ошибка 3. Именование класса не в CamelCase

class book:  # плохо: класс должен называться Book
    pass

Проблема: нарушение PEP 8 усложняет чтение кода.

Исправление: используйте Book, UserProfile, ShoppingCart.

🐛 Ошибка 4. Путаем __init__ и __new__

Проблема: говорят «__init__ создаёт объект». На самом деле объект создаёт __new__, а __init__ только наполняет его полями.

Исправление: запомните — __init__ это инициализатор, не конструктор.

🐛 Ошибка 5. Изменяемый объект по умолчанию в __init__

class Shelf:
    def __init__(self, books=[]) -> None:  # ОПАСНО: один список на все объекты
        self.books = books

Проблема: значение по умолчанию вычисляется один раз при определении класса. Все объекты без аргумента будут делить один и тот же список.

Исправление: используйте None и создавайте список внутри метода.

class Shelf:
    def __init__(self, books: list[str] | None = None) -> None:
        self.books = books if books is not None else []

Проверить по документации: особенности изменяемых значений по умолчанию и аннотация list[str] | None выходят за рамки исходного материала урока.

🐛 Ошибка 6. Думаем, что поля общие для всех объектов

book1 = Book("1984", "George Orwell")
book2 = Book("Brave New World", "Aldous Huxley")
book1.title = "Animal Farm"
print(book2.title)  # Brave New World — book2 не изменился

Исправление: каждый объект независим. Изменение полей одного объекта не влияет на другие.