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.