首页 > 解决方案 > 如何检查方法是否被子类覆盖?

问题描述

我希望能够检查子类是否覆盖了方法。例如,

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()应该打印“覆盖”,但Foo()应该打印“未覆盖”。我可以检查是否在Foobar中被覆盖而不检查返回值吗?__init__

标签: pythoninheritanceoverridingintrospection

解决方案


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

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

bar这是有效的,因为您正在检查类对象。如果您使用then ,则会在每次调用some_instance.some_method时创建一个新方法对象,这就是您的方法行不通的原因。

考虑:

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

然而,

>>> Foo.bar is Foo.bar
True

推荐阅读