如何检查方法是否被 child class 覆盖?

How do I check if a method was overwritten by a child class?

我希望能够检查 child class 是否覆盖了一个方法。例如,

class Foo:
    def __init__(self):
        # Is there something following this sort of spec?
        print("overridden" if self.bar != Foo.bar else "not overridden")
    def bar(self):
        return 0

覆盖 bar 的继承方法可能是:

class Kung(Foo):
    def __init__(self):
        super(Kung, self).__init__()
    def bar(self):
        return 1

在这种情况下,Kung() 应该打印 "overridden",但 Foo() 应该打印 "not overridden"。 我可以检查 bar 是否在 Foo __init__ 中被覆盖而不 检查 return 值吗?

这是一件很奇怪的事情。我质疑需要这样做的设计。在任何情况下,您 都可以 检查如下内容:

class Foo:
    def __init__(self):
        try:
            bar = type(self).bar
        except AttributeError:
            bar = None
        if bar is None or bar is Foo.bar:
            print("not overriden")
        else:
            print("overridden")

    def bar(self): return 0

之所以有效,是因为您正在检查 class 对象 上的 bar。如果您使用 some_instance.some_method,那么会在每次调用时创建一个 新方法对象 ,这就是您的方法不起作用的原因。

考虑:

>>> class Foo:
...     def bar(self): pass
...
>>> foo = Foo()
>>> foo.bar is foo.bar
False

然而,

>>> Foo.bar is Foo.bar
True