Я пытаюсь обернуть определенные c вызовы методов класса методом его подкласса. Я мог бы сделать это один за другим, например:
class Subclass(ParentClass):
def _handle_response(self, data, _suppress=None):
# process data
return data
def foo(self, *a, _suppress=None, **kw):
return self._handle_response(super().foo(*a, **kw), _suppress=_suppress)
def bar(self, *a, _suppress=None, **kw):
return self._handle_response(super().bar(*a, **kw), _suppress=_suppress)
Но поскольку существует ~ 20 методов, которые нужно обернуть таким образом, это кажется мне совершенно избыточным. Другой способ, который я придумал, - использовать __getattribute__
следующим образом:
class Subclass(ParentClass):
def _handle_response(self, data, _suppress=None):
# process data
return data
def __getattribute__(self, attr):
if attr in {"foo", "bar"}:
def wrapped(_self, *a, _suppress=None, **kw):
return self._handle_response(
getattr(ParentClass, attr)(_self, *a, **kw),
_suppress=_suppress
)
return wrapped
return super().__getattribute__(attr)
Это работает, но я не очень доволен тем фактом, что каждый раз, когда метод вызывается таким образом, новый функция-оболочка создана. Это много ненужных накладных расходов, которых я бы хотел избежать. Я мог бы их кэшировать, но опять же, это кажется не очень элегантным решением.
Кто-нибудь знает, как к этому подойти?