Wenn Sie Klassen, die Sie mit einer Zeichenfolge erstellen, wirklich abrufen möchten, sollten Sie sie in einem Wörterbuch speichern (oder richtig formulieren, referenzieren ). Auf diese Weise können Sie Ihre Klassen auch auf einer höheren Ebene benennen und unerwünschte Klassen vermeiden.
Beispiel aus einem Spiel, in dem in Python Schauspielerklassen definiert sind und Sie vermeiden möchten, dass andere allgemeine Klassen durch Benutzereingaben erreicht werden.
Ein anderer Ansatz (wie im folgenden Beispiel) würde darin bestehen, eine völlig neue Klasse zu erstellen, die die dictoben genannten enthält. Das würde:
- Ermöglichen Sie, dass mehrere Klasseninhaber für eine einfachere Organisation erstellt werden (z. B. einer für Schauspielerklassen und einer für Klangarten).
- Erleichtern Sie Änderungen sowohl am Inhaber als auch an den Klassen, die abgehalten werden.
- Und Sie können Klassenmethoden verwenden, um dem Diktat Klassen hinzuzufügen. (Obwohl die folgende Abstraktion nicht wirklich notwendig ist, dient sie nur der ... "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 bringt mich zurück:
<__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, das damit zu tun hat, ist das Hinzufügen einer Methode, die das einbindet, ClassHolderdamit Sie nie alle Klassen verlieren, die Sie gemacht haben: ^)