You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 16:45:04