(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
我是否需要创建某种混合物?
答案 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])