wie import_string("module_path.to.all.the.way.to.your_class")
verwenden können, wenn Sie wirklich Klassen, die Sie machen abrufen möchten Mit einer Zeichenkette sollten Sie sie in einem Wörterbuch speichern (oder richtig formuliert, Referenz). Schließlich können Sie Ihre Klassen auch auf einer höheren Ebene benennen und vermeiden, dass unerwünschte Klassen angezeigt werden.
Beispiel aus einem Spiel, in dem Schauspielerklassen in Python definiert sind und Sie vermeiden möchten, dass andere allgemeine Klassen durch Benutzereingaben erreicht werden.
Ein anderer Ansatz (wie im Beispiel unten) würde eine ganz neue Klasse bilden, die die obigen dict
enthält. Dies würde:
- Erlauben mehrere Klasseninhaber für eine einfachere Organisation gemacht werden (wie eine für Schauspieler Klassen und andere für Arten von Sound);
- Änderungen sowohl am Halter als auch an den gehaltenen Klassen vornehmen;
- Und Sie können Klassenmethoden verwenden, um Klassen zum Diktat hinzuzufügen. (Obwohl die Abstraktion unten nicht wirklich notwendig ist, ist es nur für ... "illustration").
Beispiel:
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!"
Das gibt mir:
<__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!
Ein weiteres lustiges Experiment mit denen zu tun, ist eine Methode hinzuzufügen, die die ClassHolder
so Pickles Sie nie Sie alle Klassen verlieren tat: ^)
Es gibt einige nützliche Antworten hier, aber ich fand die Antwort auf diese Frage besonders nützlich: http://stackoverflow.com/q usesions/452969/does-python-habe-ein-äquivalent-zu-java-class-forname – Tom