如何检查方法是否被 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
我希望能够检查 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