在mixin中访问基类super

时间:2015-03-25 12:43:25

标签: python multiple-inheritance

我有一个看起来像这样的类结构:

class Question(object):
    def answer(self):
        return "Base Answer"

class ExclaimMixin(object):
    def answer(self):
        return "{}!".format(super(ExclaimMixin, self).answer())

class ExpressiveQuestion(Question, ExclaimMixin)
    pass

我希望answer中的ExclaimMixin方法能够在answer中调用Question时访问ExpressiveQuestion,以便它返回{{} 1}}。

显然,在这种情况下,可以通过将"Base Answer!"中的answer方法改为ExclaimMixin来解决这个问题,但在某些情况下,这并非如此可能的(例如,类结构中的深度和分支更多)。

是否可以使用mixins实现此结果,或者只能通过修改基类树来完成?

2 个答案:

答案 0 :(得分:4)

使用mixins你需要记住基类顺序的简单规则 - “从右到左”。这意味着,所有mixin都应该实际基类之前。

class Question(object):
    def answer(self):
        return "Base Answer"

class ExclaimMixin(object):
    def answer(self):
        return "{}!".format(super(ExclaimMixin, self).answer())

class ExpressiveQuestion(ExclaimMixin, Question)
    pass

>>> q = ExpressiveQuestion()
>>> q.answer()
'Base Answer!'

答案 1 :(得分:0)

这种做法不清楚吗?你在问题中定义问题内容,​​然后在ExclaimMixin中收到一个惊叹,它收到一个你想要应用mixin的问题内容(有意义的东西),然后在ExpresiveQuestion中混合它们。

class Question(object):
    def answer(self):
        return "Base Answer"

class ExclaimMixin(object):
    def exclaim(self, answer):
        return "{}!".format(answer)

class ExpressiveQuestion(Question, ExclaimMixin):
    def expresive_question(self):
        return self.exclaim(self.answer())

在[1]中:从answer import *

在[2]中:eq = ExpressiveQuestion()

在[3]中:eq.expresive_question() Out [3]:'基础答案!'