获取子类的重写函数


Answers:


18

您可以使用访问父类,使用查看父类的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'}

vars是我想念的东西。非常感谢您(快速)的答复!
AndreasSchörgenhumer19年

parent_attrs如果需要,请在一行中:parent_attrs = {a for b in cls.__bases__ for a in dir(b)}
wjandrea

3

您可以使用__mro__元组,该元组保存方法的解析顺序。

例如:

>>> B.__mro__
( <class '__main__.B'>, <class '__main__.A'>, <class 'object'>) 

因此,您可以遍历该元组并检查某个B方法是否也在其他类之一中。


这将不排除预定义的方法,如任何dunder 方法,__init__, __eq__, ....... etc
Charif DZ

0
class A:

    def a1(self):
        pass

    def a2(self):
        pass


class B(A):

    def a2(self):
        super().a2()  
        pass

    def b1(self):
        pass
obj = B()

obj.a2()   # ***first give the output of parent class then child class***

1
我认为您误解了这个问题。类AB不能修改。OP想要知道B的方法中的哪一个覆盖了A的方法之一。
wjandrea
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.