У Python методи - це просто пари ключ-значення у словнику, приєднаному до класу. Коли ви виводите клас з базового класу, ви по суті говорите, що ім'я методу буде розглянуто спочатку у похідному словнику класу, а потім у словнику базового класу. Для того, щоб "перевизначити" метод, ви просто повторно оголошуєте метод у похідному класі.
Отже, що, якщо змінити підпис перевизначеного методу у похідному класі? Все працює правильно, якщо виклик на похідному екземплярі, але якщо ви зробите виклик на базовому екземплярі, ви отримаєте помилку, оскільки базовий клас використовує інший підпис для того самого імені методу.
Однак є часті сценарії, коли ви хочете, щоб метод похідного класу мав додаткові параметри, і ви хочете, щоб виклик методу працював без помилок на базі. Це називається "принципом заміщення Ліскова" (або LSP ), який гарантує, що якщо людина переходить від базової до похідної інстанції або навпаки, їй не потрібно переробляти свій код. Для цього в Python вам потрібно створити базовий клас за допомогою наступної техніки:
class Base:
def hello(self, name, *args, **kwargs):
print("Hello", name)
class Derived(Base):
def hello(self, name, age=None, *args, **kwargs):
super(Derived, self).hello(name, age, *args, **kwargs)
print('Your age is ', age)
b = Base()
d = Derived()
b.hello('Alice')
b.hello('Bob', age=24)
d.hello('Rick')
d.hello('John', age=30)
Вгорі буде надруковано:
Привіт Алісо
Привіт Боб
Привіт Рік
Ваш вік - Ні
Привіт Джон
Ваш вік - 30 років
.
Пограйте з цим кодом