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

python多重继承在超级上下文中调用重写函数,python,multiple-inheritance,mixins,super,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

(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\u goober()首先在其自身上下文中调用print\u blob(),然后在基类上下文中调用它

我试图得到的结果是:

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

我需要创建一些混合的东西吗?

所以<代码>自我很好<代码>自我。在您的示例中,每次调用
self
,外部称为
newclass
的就是
Markdown
的实例

当你这样想的时候,
self.print\u thing
会做你期望的事情。它寻找它能找到的第一个
print\u 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])

您的
print\u thing()
方法正在子类中被重写。这就是为什么它打印所有调用super的
mark
ssyntax是错误的。它应该是
super(Markdown,self)。print\u blob(blob)
@naveenyadav——python3.x中引入了无参数
super()
快捷方式表单。我知道print\u thing()正在被覆盖。但是,我希望能够在不会覆盖print_thing()的上下文中调用print_blob。print_blob是一个大而复杂的函数,所以关键是不要复制代码,而只是为了覆盖一个小东西来支持标记。@PaulT。--Python支持对前缀为
\uuuu
的名称进行名称篡改,例如
\uu name
。解释器实际上将这样的名称更改为
\u classname\u name
。问题是子类很难调用
\uu name
(除非你自己把名字弄乱了——这绝对是一个黑客行为)。不幸的是,我正试图避免这种情况,因为print\u blob()是一个复杂的例程,并且会涉及代码复制。