Python中如何判断子类是否自主实现了父类的指定方法
解决方案
核心思路是判断指定方法是否存在于当前子类自身的命名空间中,继承自父类的方法不会出现在子类的__dict__属性里,以此区分是继承还是自主实现。
最简实现(判断当前子类是否自主实现方法)
def is_implemented(instance, method_name: str) -> bool: # 获取实例对应的类对象 cls = type(instance) # 检查方法名是否在类自身的命名空间中(继承的方法不在此处) return method_name in cls.__dict__
测试示例
class Base : def __init__ (self,) : pass def fail (self,) : pass # 未重写.fail方法的子类 class Task (Base) : def __init__ (self,): print(is_implemented(self, 'fail')) # 输出False Task() # 已重写.fail方法的子类 class TaskOverrode(Base): def __init__(self): print(is_implemented(self, 'fail')) # 输出True def fail(self): print("子类自主实现的fail方法") TaskOverrode()
扩展实现(判断方法是否重写了继承链顶层基类的方法)
如果存在多层继承,需要判断方法是否在任意子类层级被重写(而非直接继承自最顶层基类),可以通过方法函数对象对比实现:
def is_overridden(instance, method_name: str) -> bool: cls = type(instance) current_method = getattr(cls, method_name) # 遍历方法解析顺序链,跳过当前类本身 for base_cls in cls.__mro__[1:]: if method_name in base_cls.__dict__: base_method = base_cls.__dict__[method_name] # 方法对象不一致说明发生了重写 return current_method is not base_method # 所有父类均无该方法,默认是当前类自主实现 return True
注意事项
- 如果方法是动态绑定到实例上的(而非定义在类中),需要额外补充
method_name in instance.__dict__的判断逻辑 - 该方案不适用于被装饰器完全替换原函数对象的场景,如有需要可通过比较函数名、函数签名等方式补充校验
内容的提问来源于stack exchange,提问作者sadmicrowave
相关产品推荐
相关产品推荐

