Ottieni funzioni sostituite della sottoclasse


19

C'è un modo per ottenere tutte le funzioni di sostituzione di una sottoclasse in Python?

Esempio:

class A:
    def a1(self):
        pass

    def a2(self):
        pass


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

    def b1(self):
        pass

Qui, vorrei ottenere un elenco ["a2"]per un oggetto di classe B(o per l'oggetto di classe stesso) poiché la classe ha la precedenza su Bun solo metodo, vale a dire a2.

Risposte:


18

Puoi accedere alle classi principali con cls.__bases__, trovare tutti gli attributi dei genitori con dire accedere a tutti gli attributi della classe stessa con 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'}

varsera la cosa che mi mancava. un grande grazie per la risposta (incredibilmente) veloce!
— Andreas Schörgenhumer,

parent_attrsin una riga se vuoi:parent_attrs = {a for b in cls.__bases__ for a in dir(b)}
— wjandrea,

3

È possibile utilizzare la __mro__tupla, che contiene l'ordine di risoluzione del metodo.

Per il tuo esempio:

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

Quindi è possibile eseguire il ciclo su quella tupla e verificare se un Bmetodo si trova anche in una delle altre classi.


Ciò non esclude il metodo predefinito, come qualsiasi metodo 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
Penso che tu abbia frainteso la domanda. Classi Ae Bnon possono essere modificate. OP vuole sapere quale dei Bmetodi ha la precedenza su uno dei Ametodi.
— wjandrea,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.