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.