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.

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'}

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.


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***

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.