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

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

  • Явный вызов родителя по имени вместо super().
  • Забыть super().__init__() и не проинициализировать общие поля.
  • Использовать type() вместо isinstance().
  • Думать, что Python поддерживает перегрузку методов.
  • Вызывать super() без скобок в Python 3.

❌ Ошибка 1: явный вызов родителя по имени

class Programmer(Employee):
    def __init__(self, name, language):
        Employee.__init__(self, name)  # работает, но не гибко
        self.language = language

Почему плохо: код привязан к имени Employee. При изменении иерархии или множественном наследовании легко ошибиться.

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

class Programmer(Employee):
    def __init__(self, name, language):
        super().__init__(name)
        self.language = language

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

class Programmer(Employee):
    def __init__(self, name, language):
        self.language = language


p = Programmer("Alice", "Python")
print(p.name)  # AttributeError: 'Programmer' object has no attribute 'name'

Почему возникает: родитель не успел создать общие поля, потому что дочерний класс полностью заменил __init__ без вызова super().

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

class Programmer(Employee):
    def __init__(self, name, language):
        super().__init__(name)
        self.language = language

❌ Ошибка 3: type() вместо isinstance()

class Animal:
    pass


class Dog(Animal):
    pass


d = Dog()
print(type(d) == Animal)  # False, хотя Dog — наследник Animal

Почему плохо: type() возвращает только точный класс объекта и игнорирует иерархию.

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

print(isinstance(d, Animal))  # True

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

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

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


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

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

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

class Math:
    def add(self, *args):
        return sum(args)


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

❌ Ошибка 5: super без скобок

class Child(Parent):
    def __init__(self):
        super.__init__()  # TypeError

Почему возникает: super — это функция; в Python 3 её нужно вызывать как super().

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

class Child(Parent):
    def __init__(self):
        super().__init__()

❌ Ошибка 6: классовый метод без cls

class Book:
    @classmethod
    def info():        # забыт cls
        print("Book")

Сообщение об ошибке: TypeError: info() takes 0 positional arguments but 1 was given.

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

class Book:
    @classmethod
    def info(cls):
        print("Book")
Проверить по документации: подробнее о правильном использовании super() см. Built-in Functions.