Se você realmente deseja recuperar as classes criadas com uma string, deve armazenar (ou corretamente redigido, referência las ) em um dicionário. Afinal, isso também permitirá nomear suas classes em um nível superior e evitar a exposição de classes indesejadas.
Por exemplo, em um jogo em que classes de ator são definidas em Python e você deseja evitar que outras classes gerais sejam alcançadas pela entrada do usuário.
Outra abordagem (como no exemplo abaixo) seria criar uma nova classe inteira, que contém o que foi dito dict
acima. Isso seria:
- Permitir que vários titulares de classe sejam criados para facilitar a organização (como um para classes de atores e outro para tipos de som);
- Faça modificações no titular e nas classes que estão sendo realizadas mais facilmente;
- E você pode usar métodos de classe para adicionar classes ao ditado. (Embora a abstração abaixo não seja realmente necessária, é apenas para ... "ilustração" ).
Exemplo:
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!"
Isso me retorna:
<__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!
Outro experimento divertido a ver com isso é adicionar um método que atenda às suas necessidades, ClassHolder
para que você nunca perca todas as aulas que fez: ^)