簡體   English   中英

在mixin中訪問超級基類

[英]Access base class super in mixin

我有一個看起來像這樣的類結構:

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

我希望ExclaimMixinanswer方法能夠在ExpressiveQuestion調用時訪問Question answer ,以便它返回"Base Answer!"

顯然,在這種情況下,可以通過將ExclaimMixin中的answer方法放在ExpressiveQuestion來解決,但是在某些情況下,這是不可能的(例如,在類結構中具有更大的深度和分支)。

是否可以使用mixins來實現此結果,還是只能通過修改基類樹來實現?

使用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!'

這種方法會更清晰嗎? 您在“問題”中定義問題內容,​​然后在ExclaimMixin中定義驚嘆號,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]中:從答案導入*

在[2]中:eq = ExpressiveQuestion()

在[3]中:eq.expresive_question()在[3]中:“基本答案!”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM