Si vous voulez vraiment récupérer les classes que vous créez avec une chaîne, vous devez les stocker (ou les référencer correctement ) dans un dictionnaire. Après tout, cela permettra également de nommer vos classes à un niveau supérieur et d'éviter d'exposer des classes indésirables.
Exemple, à partir d'un jeu où les classes d'acteurs sont définies en Python et que vous voulez éviter que d'autres classes générales soient atteintes par l'entrée de l'utilisateur.
Une autre approche (comme dans l'exemple ci-dessous) consisterait à créer une nouvelle classe entière, qui contient ce qui dictprécède. Ce serait:
- Permettre à plusieurs détenteurs de classe d'être organisés pour une organisation plus facile (comme, un pour les classes d'acteurs et un autre pour les types de sons);
- Facilitez les modifications du titulaire et des classes tenues;
- Et vous pouvez utiliser des méthodes de classe pour ajouter des classes au dict. (Bien que l'abstraction ci-dessous ne soit pas vraiment nécessaire, c'est simplement pour ... "illustration" ).
Exemple:
class ClassHolder:
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:
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:
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!"
Cela me renvoie:
<__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!
Une autre expérience amusante à faire avec ceux-ci consiste à ajouter une méthode qui décape le ClassHolderpour ne jamais perdre toutes les classes que vous avez faites: ^)
MISE À JOUR: Il est également possible d'utiliser un décorateur comme raccourci.
class ClassHolder:
def __init__(self):
self.classes = {}
def add_class(self, c):
self.classes[c.__name__] = c
def held(self, c):
self.add_class(c)
return c
def __getitem__(self, n):
return self.classes[n]
food_types = ClassHolder()
@food_types.held
class bacon:
taste = "salty"
@food_types.held
class chocolate:
taste = "sweet"
@food_types.held
class tee:
taste = "bitter"
@food_types.held
class lemon:
taste = "sour"
print(food_types['bacon'].taste)