Получить переопределенные функции подкласса


19

Есть ли способ получить все переопределенные функции подкласса в Python?

Пример:

class A:
    def a1(self):
        pass

    def a2(self):
        pass


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

    def b1(self):
        pass

Здесь я хотел бы получить список ["a2"]для объекта класса B(или для самого объекта класса), поскольку класс Bпереопределяет только один метод, а именно a2.

Ответы:


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это было то, чего мне не хватало. большое спасибо за (невероятно) быстрый ответ!
Андреас

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метод в одном из других классов.


Это не исключает предопределенный метод, как и любой другой метод,__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
Я думаю, что вы неправильно поняли вопрос. Классы Aи Bне могут быть изменены. OP хочет знать, какой из Bметодов переопределяет один из Aметодов.
wjandrea
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.