🐛 Типичные ошибки

⚡ Частые ловушки

  • Неправильный вызов родителя: super(name).__init__() вместо super().__init__(name).
  • Дублирование кода родителя вместо использования super().
  • Забыть вызвать super().__init__() и потерять общие поля.
  • Путаница между isinstance (объект) и issubclass (класс).
  • Попытка перегрузить метод по количеству аргументов.

❌ Ошибка 1: неправильный вызов super()

class Employee:
    def __init__(self, name: str) -> None:
        self.name = name


class Programmer(Employee):
    def __init__(self, name: str, language: str) -> None:
        super(name).__init__()  # Ошибка!
        self.language = language

Сообщение об ошибке: TypeError: super() argument 1 must be a type, not str (в зависимости от версии Python).

Почему возникает: аргументы в super() передаются не так. В современном Python достаточно написать super().__init__(name).

✅ Исправление

class Programmer(Employee):
    def __init__(self, name: str, language: str) -> None:
        super().__init__(name)
        self.language = language

❌ Ошибка 2: дублирование кода вместо super()

class Programmer(Employee):
    def __init__(self, name: str, language: str) -> None:
        self.name = name  # дублируем родителя
        self.language = language

Почему возникает: если логика инициализации имени в Employee изменится, Programmer останется со старой версией.

✅ Исправление

class Programmer(Employee):
    def __init__(self, name: str, language: str) -> None:
        super().__init__(name)
        self.language = language

❌ Ошибка 3: забыли вызвать super().__init__()

class Employee:
    def __init__(self, name: str) -> None:
        self.name = name


class Manager(Employee):
    def __init__(self, name: str, department: str) -> None:
        self.department = department
        # Забыли super().__init__(name)


m = Manager("Alice", "Sales")
print(m.name)  # AttributeError: 'Manager' object has no attribute 'name'

Почему возникает: дочерний класс переопределил __init__ полностью и не вызвал родителя, поэтому поле name не появилось.

✅ Исправление

class Manager(Employee):
    def __init__(self, name: str, department: str) -> None:
        super().__init__(name)
        self.department = department

❌ Ошибка 4: путаница isinstance и issubclass

class Book:
    pass


b = Book()
print(issubclass(b, object))  # TypeError

Сообщение об ошибке: TypeError: issubclass() arg 1 must be a class.

Почему возникает: issubclass работает с классами, а b — объект. Чтобы проверить объект, нужна isinstance.

✅ Исправление

print(isinstance(b, object))  # True
print(issubclass(Book, object))  # True

❌ Ошибка 5: попытка перегрузить метод

class Math:
    def add(self, a: int, b: int) -> int:
        return a + b

    def add(self, a: int, b: int, c: int) -> int:
        return a + b + c


m = Math()
print(m.add(1, 2))  # TypeError

Почему возникает: в Python последнее определение заменяет предыдущее. Методов с одинаковым именем но разным числом аргументов не существует.

✅ Исправление

class Math:
    def add(self, a: int, b: int, c: int = 0) -> int:
        return a + b + c


m = Math()
print(m.add(1, 2))     # 3
print(m.add(1, 2, 3))  # 6
Проверить по документации: подробнее об ошибках при наследовании и MRO см. Tutorial: Inheritance.