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.

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

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.


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.