python - 如何检查方法是否被子类覆盖?
问题描述
我希望能够检查子类是否覆盖了方法。例如,
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__
解决方案
这是一件非常奇怪的事情。我质疑需要这样做的设计。在任何情况下,您都可以检查以下内容:
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
推荐阅读
- javascript - 在 Javascript 中使用视图模型
- c# - Azure 数据库管理权限
- javascript - 无法在 Jest 中创建自定义 TestEnvironment
- java - 如何在值不为空时启用 javax 注释并在值为空时禁用?
- python - PyQt5 - 无法在按下按钮时动态创建新的小部件以发挥作用
- node.js - 从 nodejs 服务器以 html 格式显示 PDF
- css - 不同浏览器的文本宽度不同
- .net - 导入 excel 文件 mcv 代码时发生 NullReferenceException
- templating - Nunjucks 访问窗口屏幕尺寸
- angular - 根路径未正确渲染 Angular Universal