Подтвердить что ты не робот

Динамическое наследование в Python

Скажем, у меня есть две разные реализации класса

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

Как я могу динамически позволить третьему классу наследовать от ParentA или ParentB на основе чего-то вроде этого?

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)
4b9b3361

Ответ 1

Просто сохраните класс-объект в переменной (в примере ниже, он называется base) и используйте переменную в спецификации базового класса вашего оператора class.

def get_my_code(base):

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

    return MyCode

my_code = get_my_code(ParentA)

Ответ 2

Кроме того, вы можете использовать type builtin. Как вызываемый, он принимает аргументы: 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)

Это более явное, чем решение snx2, но все же - мне нравится его путь лучше.

PS. конечно, вам не нужно хранить base_class или subclass_body_dict, вы можете построить эти значения в type(), например:

MyCode = type("MyCode", (ParentA, ), {
        "initialize": initialize,
        "some_event": some_event
    })