Si realmente desea recuperar las clases que realiza con una cadena, debe almacenarlas (o redactarlas correctamente, hacer referencia ) en un diccionario. Después de todo, eso también permitirá nombrar sus clases en un nivel superior y evitar exponer clases no deseadas.
Ejemplo, de un juego en el que las clases de actores se definen en Python y desea evitar que el usuario ingrese a otras clases generales.
Otro enfoque (como en el ejemplo a continuación) sería hacer una clase completamente nueva, que contenga lo dictanterior. Esto sería:
- Permitir que se hagan múltiples titulares de clase para una organización más fácil (como, una para clases de actores y otra para tipos de sonido);
- Hacer modificaciones tanto al titular como a las clases que se imparten más fácilmente;
- Y puede usar métodos de clase para agregar clases al dict. (Aunque la siguiente abstracción no es realmente necesaria, es meramente para ... "ilustración" ).
Ejemplo:
class ClassHolder(object):
def __init__(self):
self.classes = {}
def add_class(self, c):
self.classes[c.__name__] = c
def __getitem__(self, n):
return self.classes[n]
class Foo(object):
def __init__(self):
self.a = 0
def bar(self):
return self.a + 1
class Spam(Foo):
def __init__(self):
self.a = 2
def bar(self):
return self.a + 4
class SomethingDifferent(object):
def __init__(self):
self.a = "Hello"
def add_world(self):
self.a += " World"
def add_word(self, w):
self.a += " " + w
def finish(self):
self.a += "!"
return self.a
aclasses = ClassHolder()
dclasses = ClassHolder()
aclasses.add_class(Foo)
aclasses.add_class(Spam)
dclasses.add_class(SomethingDifferent)
print aclasses
print dclasses
print "======="
print "o"
print aclasses["Foo"]
print aclasses["Spam"]
print "o"
print dclasses["SomethingDifferent"]
print "======="
g = dclasses["SomethingDifferent"]()
g.add_world()
print g.finish()
print "======="
s = []
s.append(aclasses["Foo"]())
s.append(aclasses["Spam"]())
for a in s:
print a.a
print a.bar()
print "--"
print "Done experiment!"
Esto me devuelve:
<__main__.ClassHolder object at 0x02D9EEF0>
<__main__.ClassHolder object at 0x02D9EF30>
=======
o
<class '__main__.Foo'>
<class '__main__.Spam'>
o
<class '__main__.SomethingDifferent'>
=======
Hello World!
=======
0
1
--
2
6
--
Done experiment!
Otro experimento divertido que hacer con ellos es agregar un método que conserve el encurtido ClassHolderpara que nunca pierdas todas las clases que hiciste: ^)