Паттерн «Декоратор»
Коротко: Паттерн «Декоратор» расширяет объект дополнительными функциями, оборачивая его в объект-обёртку с тем же интерфейсом, — без изменения класса и наследования от него.
Подробнее: Несколько декораторов можно вкладывать друг в друга, например журналирование, кеширование, проверка прав и измерение времени вокруг одной функции. В Python для этого есть собственный синтаксис (@decorator), в JavaScript/TypeScript — декораторы для классов, Java применяет его с потоками (new BufferedReader(new FileReader(...))).
Подробности
import time
from functools import wraСм. также: функция высшего порядка, аннотации, паттерн «Стратегия», наследование