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.