以参数形式传入函数的动态分派

2024-04-29 11:28:19 发布

您现在位置:Python中文网/ 问答频道 /正文

示例

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. 有多个来自父级的派生类

  2. bar()不一定知道传入哪个派生类

  3. bar()的调用者将不知道要传入哪个派生类函数签名

编辑

我知道一种方法,但我觉得有点老套:

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

bar('foo')

Tags: inselffoodefbartempclassparent
1条回答
网友
1楼 · 发布于 2024-04-29 11:28:19

下面是一种通用的方法,它适用于直接子类:

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

相关问题 更多 >