subclases sintaxis resueltos poo polimorfismo multiple hijas herencia ejercicios clases python

resueltos - sintaxis herencia en python



¿Cómo saber todas las clases derivadas de un padre? (3)

Supongamos que tienes una clase base A, y esta clase se reimplementa con B y C. Supongamos que también hay un método de clase A.derived() que te dice qué clases están reimplementando A, por lo tanto, devuelve [B, C], y si luego en tener class D(A): pass o class D(B): pass , ahora A.derived() devuelve [B, C, D].

¿Cómo implementarías el método A.derived() ? Tengo la sensación de que no es posible a menos que use metaclases. Puede atravesar el árbol de herencia solo de hijo a padre con el mecanismo estándar. Para tener el enlace en la otra dirección, debe mantenerlo "a mano", y esto significa anular la mecánica de declaración de clase tradicional.


Aquí hay otra implementación que imprimirá recursivamente todas las subclases, con sangría.

def findsubclass(baseclass, indent=0): if indent == 0: print "Subclasses of %s are:" % baseclass.__name__ indent = indent + 1 for c in baseclass.__subclasses__(): print "-"*indent*4 + ">" + c.__name__ findsubclass(c, indent)


Dada la discusión sobre las subclases , una implementación podría tener este aspecto:

class A(object): @classmethod def derived(cls): return [c.__name__ for c in cls.__subclasses__()]

edición : es posible que también desee ver esta answer a una pregunta ligeramente diferente.


Si define sus clases como una clase de nuevo estilo (subclase de object ), esto es posible ya que las subclases se guardan en __subclasses__ .

class A(object): def hello(self): print "Hello A" class B(A): def hello(self): print "Hello B" >>> for cls in A.__subclasses__(): ... print cls.__name__ ... B

No sé exactamente cuándo se introdujo esto o si hay alguna consideración especial. Sin embargo, funciona bien para declarar una subclase en una función:

>>> def f(x): ... class C(A): ... def hello(self): ... print "Hello C" ... c = C() ... c.hello() ... print x ... for cls in A.__subclasses__(): ... print cls.__name__ ... >>> f(4) Hello C 4 B C

Sin embargo, debe tener en cuenta que, hasta que se hayan ejecutado las definiciones de clase, el intérprete no las conoce. En el ejemplo anterior, C no se reconoce como una subclase de A hasta que se ejecuta la función f . Pero esto es lo mismo para las clases de python todas las veces, como supongo que ya están al tanto.