У меня есть несколько классов, которые обернуты другими классами, чтобы добавить новые функции.Как создать фабрику Mixin в Python?
К сожалению, классы-оболочки не реализуют сквозные функции для классов, которые они обертывают, поэтому оболочка не может использоваться взаимозаменяемо с исходным классом.
Я хотел бы динамически создавать классы, которые содержат функциональность как оболочки, так и исходного класса.
Идея, которую я имел, заключалась в создании класса микширования и использовании фабрики для применения к существующему классу для динамического создания нового класса двойного назначения. Это должно позволить мне написать mix-in один раз, и для смешанного класса, который будет использоваться, чтобы обеспечить либо исходную функциональность, либо расширенную функциональность из-за микширования через один объект.
Это та вещь, я после того, как:
class A:
def __init__(self):
self.name = 'A'
def doA(self):
print "A:", self.name
class B(A):
def __init__(self):
self.name = 'B'
def doB(self):
print "B:", self.name
class C(A):
def __init__(self):
self.name = 'C'
def doC(self):
print "C:", self.name
class D:
def doD(self):
print "D:", self.name
class BD(B,D):
pass
def MixinFactory(name, base_class, mixin):
print "Creating %s" % name
return class(base_class, mixin) # SyntaxError: invalid syntax
a, b, c, d, bd = A(), B(), C(), D(), BD()
bd2 = MixinFactory('BD2', B, D)()
cd = MixinFactory('CD', C, D)()
a.doA() # A: A
b.doA() # A: B
b.doB() # B: B
c.doA() # A: C
c.doC() # C: C
bd.doA() # A: B
bd.doB() # B: B
bd.doD() # D: B
bd2.doA() # A: B
bd2.doB() # B: B
bd2.doD() # D: B
cd.doA() # A: C
cd.doC() # C: C
cd.doD() # D: C
Проблема заключается в том, что, очевидно, что вы не просто возвращения класса из функции может. Однако, игнорируя синтаксическую ошибку, приведенный выше код действительно показывает, чего я пытаюсь достичь.
У меня была игра с тремя вариантами аргумента type()
, но я не мог заставить ее работать, поэтому я не уверен, что это правильный подход.
Я предполагаю, что создание фабрики смешивания такого типа возможно в Python, так что я должен понимать, чтобы реализовать его?
Как Niklas R прокомментировал this answer на вопрос Python dynamic inheritance: How to choose base class upon instance creation? обеспечивает решение моего вопроса, но Ben «s ответ здесь дает лучшее объяснение того, почему.
Что случилось с 'класс BD2 (B, D): pass'? Почему это не идеальная «фабрика микшинга»? Что случилось с доступным синтаксисом mixin? –
Связанный: http://stackoverflow.com/questions/7057019/python-dynamic-inheritance-how-to-choose-base-class-upon-instance-creation/7058640#7058640 –
* Неверный комментарий * –