class Parent:
def method(self):
print("Parent method")
class Child(Parent):
def method(self):
print("Child method")
obj = Child()
obj.method() # Выведет "Child method"
Переопределение метода в наследуемом классе - это ключевой механизм объектно-ориентированного программирования, позволяющий изменить поведение унаследованного метода в дочернем классе, адаптируя его под нужды этого класса. Это достигается путем создания метода с тем же именем и сигнатурой (набором аргументов) в дочернем классе.
Пример:
class Animal:
def make_sound(self):
print("Generic animal sound")
class Dog(Animal):
def make_sound(self):
print("Woof!")
class Cat(Animal):
def make_sound(self):
print("Meow!")
animal = Animal()
dog = Dog()
cat = Cat()
animal.make_sound() # Вывод: Generic animal sound
dog.make_sound() # Вывод: Woof!
cat.make_sound() # Вывод: Meow!
Объяснение:
Animal
имеет метод make_sound
, который выводит "Generic animal sound".Dog
и Cat
наследуются от Animal
.make_sound
переопределяется. Вместо общего звука животного, каждый класс теперь производит звук, характерный для конкретного животного (лай для собаки и мяуканье для кошки).make_sound()
для экземпляра класса Dog
, вызывается переопределенная версия метода, а не метод из базового класса Animal
. То же самое и для класса Cat
.Когда использовать переопределение методов:
super()
).Использование super()
для вызова метода базового класса:
class Animal:
def __init__(self, name):
self.name = name
def make_sound(self):
print("Generic animal sound")
class Dog(Animal):
def __init__(self, name, breed):
super().__init__(name) # Вызов конструктора базового класса
self.breed = breed
def make_sound(self):
super().make_sound() # Вызов метода make_sound базового класса
print("Woof!")
В этом примере, при создании экземпляра класса Dog
, конструктор Dog
вызывает конструктор базового класса Animal
с помощью super().__init__(name)
, чтобы инициализировать атрибут name
. В методе make_sound()
сначала вызывается make_sound()
родительского класса, а затем выводится "Woof!".
Таким образом, переопределение методов позволяет создавать гибкие и расширяемые иерархии классов, где каждый класс может адаптировать поведение, унаследованное от базового класса, под свои специфические нужды.