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

python multiple inheritance calling overridden functions in super context

(Python 3)

我正在尝试使用一些新奇的格式化例程来扩展 class,但是我也希望能够使用基础 class.[=14 中的格式化例程=]

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

我需要创建某种 mixin 东西吗?

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

当您这样想时,self.print_thing 就如您所愿。它寻找它能找到的第一个 print_thing 方法,然后用 self 作为第一个参数调用它。

好的,既然我们已经排序了......我们如何做你想做的事?好吧,(我不能说得足够强烈)如果不更明确地说明您真正想要什么,就没有 clean 方法可以做到这一点。在这种情况下,我建议 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])