Есть ли способ добавить динамическую функцию «подсказка» в абстрактный базовый класс, фактически не добавляя функцию?

#python #pycharm #python-3.8

Вопрос:

Я работаю над проектом, в котором набор функций событий тестируется в дереве объектов.

 class ObjectA:
    pass

class ObjectB:
    def on_event(text: str):
        print(text)

many_objects = [
    ObjectA(),
    ObjectA(),
    ObjectA(),
    ObjectA(),
    ObjectA(),
    ObjectB(),  # <<<
    ObjectA()
]

def call_on_event(text: str):
    for obj in many_objects:
        if hasattr(obj, 'on_event'):
            func = getattr(obj, 'on_event')
            if callable(func):
                func.on_event(text)
 

Теперь существует множество различных событий (>50), которые динамически тестируются на большом дереве объектов, как показано в принципе в приведенном выше примере.

Если бы я добавил все возможные события в абстрактный базовый класс, я бы получил хорошие подсказки по типу и завершению кода в PyCharm и посмотрел, какие события возможны для объекта. Но система событий будет вызывать существующий метод в абстрактном базовом классе для каждого объекта.

Мой вопрос таков:

Есть ли способ, как я могу добавить все возможные методы событий в абстрактный базовый класс, чтобы получить подсказки по типу и завершению кода, но на самом деле не добавлять функциональность в код?

Комментарии:

1. Я не уверен, что понимаю ваш вопрос. Если вы определяете свой абстрактный базовый класс, вы просто помещаете туда абстрактные методы.

2. Да, но этот метод добавит атрибут в класс. Тогда каждый объект будет иметь каждый метод события, определенный в абстрактном базовом классе.

3. Как еще, по-вашему, это могло бы сработать?

4. То , что вы пытаетесь выразить Union[ObjectA, ObjectB] , — это, хотя и не уверен, поможет ли это вашей конечной цели завершения кода…