Obtenez les fonctions remplacées de la sous-classe

19

Existe-t-il un moyen d'obtenir toutes les fonctions remplacées d'une sous-classe en Python?

Exemple:

class A:
    def a1(self):
        pass

    def a2(self):
        pass


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

    def b1(self):
        pass

Ici, je voudrais obtenir une liste ["a2"]pour un objet de classe B(ou pour l'objet de classe lui-même) car la classe Bne remplace qu'une seule méthode, à savoir a2.

Andreas Schörgenhumer
la source

Réponses:

18

Vous pouvez accéder aux classes parents avec cls.__bases__, rechercher tous les attributs des parents avec diret accéder à tous les attributs de la classe elle-même avec 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
la source
varsétait la chose qui me manquait. un grand merci pour la réponse (incroyablement) rapide!
Andreas Schörgenhumer
parent_attrsen une seule ligne si vous voulez:parent_attrs = {a for b in cls.__bases__ for a in dir(b)}
wjandrea
3

Vous pouvez utiliser le __mro__tuple, qui contient l'ordre de résolution des méthodes.

Pour votre exemple:

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

Vous pouvez donc parcourir ce tuple et vérifier si une Bméthode se trouve également dans l'une des autres classes.

Adelin
la source
Cela n'exclura pas la méthode prédéfinie, comme toute méthode de dunder ,__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
la source
1
Je pense que vous avez mal compris la question. Les classes Aet Bne peuvent pas être modifiées. OP veut savoir laquelle des Bméthodes prévaut sur l'une des Améthodes.
wjandrea