Пожалуйста, рассмотрите следующий код, реализующий простой MixIn
:
class Story(object):
def __init__(self, name, content):
self.name = name
self.content = content
class StoryHTMLMixin(object):
def render(self):
return ("<html><title>%s</title>"
"<body>%s</body></html>"
% (self.name, self.content))
def MixIn(TargetClass, MixInClass):
if MixInClass not in TargetClass.__bases__:
TargetClass.__bases__ += (MixInClass,)
if __name__ == "__main__":
my_story = Story("My Life", "<p>Is good.</p>")
# plug-in the MixIn here
MixIn(Story, StoryHTMLMixin)
# now I can render the story as HTML
print my_story.render()
Запуск main
приводит к следующей ошибке:
TypeError: Cannot create a consistent method resolution
order (MRO) for bases object, StoryHTMLMixin
Проблема в том, что и Story
, и StoryHTMLMixin
получены из объект
, привязка методов во время выполнения) без использования MixIns. Однако вопрос по-прежнему остается - это единственный вариант использования, когда возня с MRO неразрешима без повторной реализации или возврата к классам старого стиля?