Erhalten Sie überschriebene Funktionen der Unterklasse

19

Gibt es eine Möglichkeit, alle Überschreibungsfunktionen einer Unterklasse in Python abzurufen?

Beispiel:

class A:
    def a1(self):
        pass

    def a2(self):
        pass


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

    def b1(self):
        pass

Hier möchte ich eine Liste ["a2"]für ein Klassenobjekt B(oder für das Klassenobjekt selbst) erhalten, da die Klasse Bnur eine einzige Methode überschreibt, nämlich a2.

Andreas Schörgenhumer
quelle

Antworten:

18

Sie können mit auf die übergeordneten Klassen zugreifen cls.__bases__, alle Attribute der übergeordneten Klassen finden dirund auf alle Attribute der Klasse selbst zugreifen mit 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'}
Aran-Fey
quelle
varswar das, was mir fehlte. Vielen Dank für die (unglaublich) schnelle Antwort!
Andreas Schörgenhumer
parent_attrsin einer Zeile, wenn Sie wollen:parent_attrs = {a for b in cls.__bases__ for a in dir(b)}
wjandrea
3

Sie können das __mro__Tupel verwenden, das die Reihenfolge der Methodenauflösung enthält.

Für Ihr Beispiel:

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

Sie können dieses Tupel also durchlaufen und prüfen, ob sich eine BMethode auch in einer der anderen Klassen befindet.

Adelin
quelle
Dies schließt vordefinierte Methode nicht aus, wie jede andere Methode,__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***
Manish Sharma
quelle
1
Ich denke, Sie haben die Frage falsch verstanden. Klassen Aund Bkönnen nicht geändert werden. OP möchte wissen, welche BMethoden eine der Methoden überschreiben A.
Wjandrea