Если вы действительно хотите получить классы, которые вы делаете со строкой, вы должны сохранить (или правильно сформулировать, ссылку ) их в словаре. В конце концов, это также позволит назвать ваши классы на более высоком уровне и избежать выявления нежелательных классов.
Например, из игры, в которой классы актеров определены в Python, и вы хотите избежать других общих классов, которые будут доступны при вводе пользователем.
Другой подход (как в примере ниже) состоит в создании целого нового класса, который содержит dictвышеупомянутое. Это будет:
- Разрешить создание нескольких владельцев классов для упрощения организации (например, один для актерских классов и другой для типов звука);
- Вносите изменения как в владельца, так и в классы, которые легче проводить;
- И вы можете использовать методы класса, чтобы добавить классы к dict. (Хотя приведенная ниже абстракция на самом деле не нужна, она просто для ... "иллюстрации" ).
Пример:
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!"
Это возвращает меня:
<__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!
Еще один забавный эксперимент с ними - добавить метод, который перебирает все, ClassHolderчтобы вы никогда не потеряли все классы, которые вы сделали: ^)