Динамическое наследование в 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)
Ответы
Ответ 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
})