Si vous voulez vraiment récupérer les classes que vous faites avec une chaîne, vous devriez stocker (ou formuler correctement, référence ) dans un dictionnaire. Après tout, cela permettra aussi de nommer vos classes à un niveau plus élevé et d'éviter d'exposer des classes non désirées.
Exemple, d'un jeu où les classes d'acteurs sont définies en Python et où l'on veut é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 toute nouvelle classe, qui contiendrait les éléments suivants dict
ci-dessus. Ce serait :
- Permettre la création de plusieurs classes pour faciliter l'organisation (par exemple, une pour les classes d'acteurs et une autre pour les types de sons) ;
- Faciliter les modifications tant du titulaire que des cours dispensés ;
- Et vous pouvez utiliser les méthodes de classe pour ajouter des classes au dict. (Bien que l'abstraction ci-dessous ne soit pas vraiment nécessaire, elle 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-là est d'ajouter une méthode qui décape les ClassHolder
pour que vous ne perdiez jamais tous les cours que vous avez faits :^)
UPDATE : 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
# -- the decorator
def held(self, c):
self.add_class(c)
# Decorators have to return the function/class passed (or a modified variant thereof), however I'd rather do this separately than retroactively change add_class, so.
# "held" is more succint, anyway.
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" # coffee, ftw ;)
@food_types.held
class lemon:
taste = "sour"
print(food_types['bacon'].taste) # No manual add_class needed! :D