我有一个看起来像这样的类结构:
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实现此结果,或者只能通过修改基类树来完成?
答案 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]:'基础答案!'