Динамическая отправка с функцией, переданной в качестве параметра - PullRequest
0 голосов
/ 10 октября 2018

Пример

class Parent:

  def foo(self):
    print('parent')


class DerivedA(Parent):

  def foo(self):
    print('derived A')


class DerivedB(Parent):

  def foo(self):
    print('derived B')

def bar(passed_in_func):
  temp = [DerivedA(), DerivedB()]
  for derived in temp:
    passed_in_func(derived)

bar(Parent.foo)

Выход:

parent
parent

Требуемый выход:

derived A
derived B

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

  1. Существует несколько производных классов из Parent

  2. bar() не обязательно будет знать, какой из производных классов передан в

  3. Вызывающий bar() не будет знать, какую сигнатуру функции производного класса передать в

РЕДАКТИРОВАТЬ

Я знаю один способ сделать это, но я считаю это немного хакерским:

def bar(passed_in_func):
  temp = [DerivedA(), DerivedB()]
  for derived in temp:
    getattr(derived, passed_in_func)()

bar('foo')

1 Ответ

0 голосов
/ 10 октября 2018

Вот общий способ сделать это, который будет работать для непосредственных подклассов:

class Parent:
    def foo(self):
        print('parent')


class DerivedA(Parent):
    def foo(self):
        print('derived A')


class DerivedB(Parent):
    def foo(self):
        print('derived B')


def bar(passed_in_func):
    classname = passed_in_func.__qualname__.split('.')[0]
    parent = eval(classname)
    for derived in parent.__subclasses__():
        getattr(derived(), passed_in_func.__name__)()

bar(Parent.foo)

Вывод:

derived A
derived B
...