Python中的动态继承

Mor*_*ten 26 python inheritance

假设我有两个不同的类实现

class ParentA:
    def initialize(self):
        pass

    def some_event(self):
        pass

    def order(self, value):
        # handle order in some way for Parent A


class ParentB:
    def initialize(self):
        pass

    def some_event(self):
        pass

    def order(self, value):
        # handle order in another for Parent B
Run Code Online (Sandbox Code Playgroud)

我怎样才能动态地让一些第三类继承ParentAParentB基于这样的东西?

class MyCode:
    def initialize(self):
        self.initial_value = 1

    def some_event(self):
        # handle event
        order(self.initial_value)


# let MyCode inherit from ParentA and run
run(my_code, ParentA)
Run Code Online (Sandbox Code Playgroud)

shx*_*hx2 54

只需将类对象存储在变量中(在下面的示例中,它被命名base),并使用class语句的base-class-spec中的变量.

def get_my_code(base):

    class MyCode(base):
        def initialize(self):
          ...

    return MyCode

my_code = get_my_code(ParentA)
Run Code Online (Sandbox Code Playgroud)

  • 根据您使用相同参数调用“get_my_code”的频率,这将创建许多本质上相同但不同的类。某种形式的记忆会很好。 (5认同)
  • 聪明简单。谢谢 (3认同)
  • 仅供参考....如果有人需要有多个父类(例如上述情况下的 ParentA、ParentB),那么您可以使用 `base` 作为父类的列表,然后执行 `class MyCode(*base): `......实例化时,使用: `my_code = get_my_code([ParentA, ParentB])` (2认同)

Fil*_*zak 5

另外,您可以使用type内置的。可以调用的它带有参数:(name, bases, dct以最简单的形式)。

def initialize(self):
    self.initial_value = 1

def some_event(self):
    # handle event
    order(self.initial_value)

subclass_body_dict = {
    "initialize": initialize,
    "some_event": some_event
}

base_class = ParentA # or ParentB, as you wish

MyCode = type("MyCode", (base_class, ), subclass_body_dict)
Run Code Online (Sandbox Code Playgroud)

这比snx2解决方案更明确,但仍然-我更喜欢他的方式。

PS。当然,您不必存储base_class或subclass_body_dict,也可以在type()调用中构建这些值,例如:

MyCode = type("MyCode", (ParentA, ), {
        "initialize": initialize,
        "some_event": some_event
    })
Run Code Online (Sandbox Code Playgroud)