【发布时间】:2011-11-01 17:16:42
【问题描述】:
例如,我有一个
class BaseHandler(object):
def prepare(self):
self.prepped = 1
我不希望每个继承 BaseHandler 并且还想实现 prepare 的人都必须记住调用
super(SubBaseHandler, self).prepare()
即使子类也实现了prepare,有没有办法确保超类方法运行?
【问题讨论】:
-
简短的回答是你不能。如果它被覆盖,则需要成员查找算法来返回覆盖的版本。一种更强大的方法是不需要覆盖这些重要部分的设计,尽管这并不总是可能的。或者,编写代码,使其在未调用您的版本时引发错误或产生明显错误的结果,以帮助调试。
-
@delnan:使用元类不会依赖于实现(但很可能被认为是一种 hack,至少如果用于此目的)。
-
@Sven:我可以发誓有一个“可能”,特别是因为我不相信自己会列举所有的可能性。但我还是修改了我的评论。
-
@Sven 我认为元类在这里没有任何帮助。
-
@Lucho:嗯,我可以看到他要去哪里 - 看看子类是否覆盖了方法,如果是这样,用一个首先调用基类版本的版本包装它。不完美(可以在创建类后再次覆盖,可能导致人们手动调用基类实现,尽管它已经为他们完成了),但适度健壮。