如果你真的想要检索用字符串创建的类,你应该在字典中存储(或适当措辞,引用)它们。 毕竟,这也允许在更高级别命名您的类,并避免暴露不需要的类。
例如,游戏中使用Python定义actor类,并且您希望避免用户输入到达其他常规类。
另一种方法(如下面的例子中)将创建一个完整的新类,它包含上面的ClassHolder。 这个会:
允许多个类持有者更容易组织(例如,一个用于演员类,另一个用于声音类型);
对持有人和持有的课程进行修改更容易;
您可以使用类方法向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!"
这让我回报:
=======
o
o
=======
Hello World!
=======
0
1
--
2
6
--
Done experiment!
另一个有趣的实验就是添加一个方法来腌制ClassHolder,这样你就不会丢失你所做的所有类:^)