События и триггеры Python

#python #python-3.x #inheritance #events #python-class

Вопрос:

Есть ли способ запускать ДОЧЕРНИЕ объекты в Python? Так что я имею в виду:

 class A(object):
  def a(self):
    print("Hello from A")
    # ???

class B(A)
  def b(self):
    print("Now in B")
 

и мне нужно запустить b() функцию из класса A , и A только «знает», что B класс распространяется на нее

Я хочу использовать его для событий в чем-то вроде плагинов, поэтому будут некоторые модули с классами, расширяющими основной класс, из которых я буду запускать события в плагинах

Ответ №1:

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

 class AbstractPlugin(object):
  def trigger(self):
    pass

class APlugin(AbstractPlugin):
  def trigger(self):
    print("This is plugin A")

class BPlugin(AbstractPlugin):
  def trigger(self):
    print("This is plugin B")
 

С вашим классом А вы могли бы делать такие вещи, как это:

 class A(object):
  def a(self, plugin: AbstractPlugin):
    print("Hello from A")
    plugin.trigger()

master = A()
plugin_a = APlugin()
plugin_b = BPlugin()

master.a(plugin_a)
master.a(plugin_b)
 

Это приведет к:

 Hello from A
This is plugin A
Hello from A
This is plugin B
 

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

1. Но я хочу вызвать функцию в B внутри A, поэтому единственный способ запустить функции внутри B-это вызвать их из A

2. Но почему тогда B наследуется от A? В своем примере вы показываете, что B относится к типу A. Следовательно, следствием является вызов методов, специфичных для B, с использованием интерфейса, предоставляемого A. Не могли бы вы подробнее рассказать об этом наследстве?

3. Поэтому в вашем примере, когда я вызываю a() из класса A, он использует функцию A b (), но я хочу вызвать функцию B().

4. Я добавил небольшой пример, чтобы вы увидели, как вызывается b() из B. Это помогает?

5. Я пробовал это, но, как я уже говорил, мне нужно перейти к функции B b() из класса