Какой лучший способ расширить класс? Примерный алгоритм такойВ метод приходит объектПри неком условии нужно добавить объекту функциональностьРаботать дальше
Похоже на паттерн декоратор, но у исходного объекта нет интерфейсов, и нужно именно добавить функциональность, а не расширить уже существующие методы
Спасибо!
P.S. изменять исходный объект нельзя
Думал о таком.Создать класс оберткуВ конструктор передавать желаемый объект для расширения и добавить как поле классасоздать новый метод с необходимым функционаломсоздать __call магический метод и переводить все вызовы методов на изначальный объект
Проблема в таком подходе что IDE (шторм) не выдает подсказок при вызове методов, а хотелось бы. Может есть какой-то способ указать? кроме как @method в комментариях, т.к. там очень много методов
P.S.2 расширить класс наследованием тоже сложно, так как у исходного класса сложный конструктор, и просто вытащить значения из исходного объекта и передать в конструктор не получится

21 Авг 2019 в 06:58
215 +1
1
Ответы
1

В данной ситуации можно воспользоваться магическим методом __getattr__. Этот метод вызывается, когда пытаются получить доступ к атрибуту, который не существует в объекте. Можно перехватить вызов несуществующих методов и передать их исходному объекту.

Примерно так:

class Wrapper:
def __init__(self, obj):
self.obj = obj
def __getattr__(self, attr):
if hasattr(self.obj, attr):
return getattr(self.obj, attr)
else:
def new_method(*args, **kwargs):
# добавление функциональности
return new_method
# Пример использования
obj = OriginalClass()
wrapped_obj = Wrapper(obj)
wrapped_obj.new_method() # Если метода нет в обертке, будет вызван метод new_method из Wrapper

Такой подход позволит добавить новый функционал при вызове несуществующих методов, при этом сохраняя возможность использовать подсказки IDE.

20 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир