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])
(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])