python多重继承在超级上下文中调用重写函数

时间:2016-03-15 05:47:53

标签: python multiple-inheritance mixins super

(Python 3)

我尝试使用一些奇特的新格式化例程来扩展一个类,但是我也希望能够在基类中使用格式化例程。

class Plaintext(object):
    def print_thing(self, thing):
        print("plain", thing)

    def print_blob(self, blob):
        for thing in blob:
            self.print_thing(thing)

    def print_goober(self, blob):
        print("plaintext")
        self.print_blob(blob)

class Markdown(Plaintext):
    def print_thing(self, thing):
        print("mark", thing)

    def print_goober(self, blob):
        print("markdown")
        self.print_blob(blob)
        super().print_blob(blob)

newclass = Markdown()
newclass.print_goober([1,2,3])

跑步时,我得到:

markdown
mark 1
mark 2
mark 3
mark 1
mark 2
mark 3

如何让newclass.print_goober()首先在其自身上下文中调用print_blob(),然后在BaseClass的上下文中调用?

我试图获得的输出是:

markdown
mark 1
mark 2
mark 3
plain 1
plain 2
plain 3

我是否需要创建某种混合物?

1 个答案:

答案 0 :(得分:1)

所以... self很好...... self。在您的示例中,每次调用self时, 都是Markdown的实例,在外部称为newclass

当你以这种方式思考时,self.print_thing会按照你的期望去做。它查找它可以找到的第一个print_thing方法,然后使用self作为第一个参数调用它。

好吧,既然我们已经排好了......我们怎么做你想做的事情?好吧,(并且我不能说得足够强烈)没有干净的方式来做到这一点,而不是更明确地了解你真正想要的东西。在这种情况下,我建议markdown定义调用旧方法的新方法:

class Plaintext(object):
    def print_thing(self, thing):
        print("plain", thing)

    def print_blob(self, blob):
        for thing in blob:
            self.print_thing(thing)

    def print_goober(self, blob):
        print("plaintext")
        self.print_blob(blob)

class Markdown(Plaintext):
    def print_markdown_thing(self, thing):
        print("mark", thing)

    def print_markdown_blob(self, blob):
        for thing in blob:
            self.print_markdown_thing(thing)

    def print_goober(self, blob):
        print("markdown")
        self.print_markdown_blob(blob)
        self.print_blob(blob)

newclass = Markdown()
newclass.print_goober([1,2,3])