Obtener funciones anuladas de subclase

19

¿Hay alguna manera de obtener todas las funciones anuladas de una subclase en Python?

Ejemplo:

class A:
    def a1(self):
        pass

    def a2(self):
        pass


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

    def b1(self):
        pass

Aquí, me gustaría obtener una lista ["a2"]para un objeto de clase B(o para el objeto de clase en sí) ya que la clase Banula solo un método, a saber a2.

Andreas Schörgenhumer
fuente

Respuestas:

18

Puede acceder a las clases padre con cls.__bases__, encontrar todos los atributos de los padres con diry acceder a todos los atributos de la clase 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'}
Aran-Fey
fuente
varsEra lo que me faltaba. muchas gracias por la respuesta (increíblemente) rápida!
Andreas Schörgenhumer
parent_attrsen una línea si quieres:parent_attrs = {a for b in cls.__bases__ for a in dir(b)}
wjandrea
3

Puede hacer uso de la __mro__tupla, que contiene el orden de resolución del método.

Por su ejemplo:

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

Por lo tanto, puede recorrer esa tupla y verificar si un Bmétodo también está en una de las otras clases.

Adelin
fuente
Esto no excluirá el método predefinido, como cualquier método 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
fuente
1
Creo que entendiste mal la pregunta. Clases Ay Bno se pueden modificar. OP quiere saber cuál de Blos métodos anula uno de Alos métodos.
wjandrea