Si realmente desea recuperar las clases que realice con una cadena, debe almacenar (o redactar correctamente, referencia) en un diccionario. Después de todo, eso también permitirá nombrar tus clases en un nivel superior y evitar exponer las clases no deseadas.
Ejemplo, de un juego donde las clases de actor están definidas en Python y desea evitar que otras clases generales sean contactadas por la entrada del usuario.
Otro enfoque (como en el ejemplo a continuación) sería hacer una nueva clase completa, que contiene el dict
anterior. Esto sería:
- Permitir que se creen múltiples titulares de clases para facilitar la organización (como, uno para las clases de actor y otro para los tipos de sonido);
- Modifique tanto el titular como las clases;
- Y puede usar los métodos de clase para agregar clases al dict. (Aunque la abstracción a continuación no es realmente necesaria, es simplemente 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 para hacer con ellos es añadir un método que pepinillos la ClassHolder
lo que nunca se pierden todas las clases que did: ^)
Aquí hay algunas respuestas útiles, pero encontré la respuesta a esta pregunta particularmente útil: http://stackoverflow.com/q uestions/452969/does-python-have-an-equivalent-to-java-class-forname – Tom