首页 > 解决方案 > 获取子类的覆盖函数

问题描述

有没有办法在 Python 中获取子类的所有覆盖函数?

例子:

class A:
    def a1(self):
        pass

    def a2(self):
        pass


class B(A):
    def a2(self):
        pass

    def b1(self):
        pass

在这里,我想获取类对象(或类对象本身)的列表,因为类["a2"]仅覆盖一个方法,即.BBa2

标签: pythonreflectionoverridingsubclass

解决方案


您可以使用 访问父类cls.__bases__,使用 查找父类的所有属性dir,并使用 访问类本身的所有属性vars

def get_overridden_methods(cls):
    # collect all attributes inherited from parent classes
    parent_attrs = set()
    for base in cls.__bases__:
        parent_attrs.update(dir(base))

    # find all methods implemented in the class itself
    methods = {name for name, thing in vars(cls).items() if callable(thing)}

    # return the intersection of both
    return parent_attrs.intersection(methods)
>>> get_overridden_methods(B)
{'a2'}

推荐阅读