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