Урок 66 — Ошибки: Основы ООП
⚡ Кратко
Главные ошибки новичков: пропуск 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 не изменился
Исправление: каждый объект независим. Изменение полей одного объекта не влияет на другие.