Отримати замінені функції підкласу


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не можуть бути змінені. ОП хоче знати, який із Bметодів Росії переважає один із Aметодів.
wjandrea
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.