python多重继承在超级上下文中调用重写函数
(Python 3) 我试图用一些新奇的格式化例程扩展一个类,但是我也希望能够在基类中使用格式化例程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
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()是一个复杂的例程,并且会涉及代码复制。