❌ Ошибка 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.