Якщо ви дійсно хочете отримати класи, які ви робите за допомогою рядка, вам слід зберігати (або правильно сформулювати текст) посилання ) на них у словнику. Зрештою, це також дозволить назвати ваші класи на більш високому рівні та уникнути викриття небажаних класів.
Приклад, з гри, де класи акторів визначені в Python, і ви хочете уникати інших загальних класів, до яких можна дістатися користувачем.
Інший підхід (як у прикладі нижче) мав би скласти цілий новий клас, який дотримується 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щоб ви ніколи не втрачали всі класи, які ви робили: ^)