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.

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

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.


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.