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.