Python Glossary English

все Python 3ООПпонятие

Наследование

наследование

Дочерний класс наследует атрибуты и методы родительского. Переопределение методов — полиморфизм.

Синтаксис

class Child(Parent): ...

Самая частая ошибка — переопределить __init__ в потомке и забыть вызвать super().__init__(...): код родителя не отработает и его атрибуты просто не появятся. Наследование жёстко связывает классы; если нужна лишь чужая функциональность, композиция (хранить объект как поле) часто гибче, чем «класс-потомок ради переиспользования».

Примеры

class Animal:
    def __init__(self, name):
        self.name = name
    def speak(self):
        return '...'
class Dog(Animal):
    def speak(self):
        return 'Woof!'
class Cat(Animal):
    def speak(self):
        return 'Meow!'
for a in [Dog('Rex'), Cat('Whiskers')]:
    print(a.name, a.speak())  # → Rex Woof! / Whiskers Meow!
print(isinstance(Dog('x'), Animal))  # → True
print(isinstance(Dog('x'), Cat))  # → False
print(issubclass(Dog, Animal))  # → True
# Дочерний класс добавляет атрибуты
class Vehicle:
    def __init__(self, brand):
        self.brand = brand
class Car(Vehicle):
    def __init__(self, brand, doors):
        super().__init__(brand)
        self.doors = doors
c = Car('Toyota', 4)
print(c.brand, c.doors)  # → Toyota 4
# Наследование встроенных классов
class MyList(list):
    def total(self):
        return sum(self)
ml = MyList([1, 2, 3, 4])
print(ml.total())  # → 10
print(ml[0])  # → 1 — всё поведение list сохранилось
# Поиск метода идёт по MRO
class A:
    def hello(self):
        return 'A'
class B(A):
    pass
class C(B):
    pass
print(C().hello())  # → A
print([k.__name__ for k in C.__mro__])  # → ['C', 'B', 'A', 'object']
# Переопределение с вызовом родителя
class Employee:
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
    def describe(self):
        return f'{self.name}: {self.salary}'
class Manager(Employee):
    def __init__(self, name, salary, dept):
        super().__init__(name, salary)
        self.dept = dept
    def describe(self):
        return super().describe() + f' [{self.dept}]'
print(Manager('Alice', 80000, 'IT').describe())  # → Alice: 80000 [IT]

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности