2009-07-30 5 views
7

En Python est-il possible d'instancier une classe à travers un dictionnaire?Dictionnaire avec des classes?

shapes = {'1':Square(), '2':Circle(), '3':Triangle()} 

x = shapes[raw_input()] 

Je veux laisser l'utilisateur choisir dans un menu et ne pas coder les instructions énormes sinon else sur l'entrée. Par exemple, si l'utilisateur a entré 2, x serait alors une nouvelle instance de Circle. Est-ce possible?

+0

Lorsque vous essayé, qu'est-il arrivé? –

+0

Eh bien, je le fais avec des menus, et juste avoir un wrapper de menu générique gérer ce menu à charger. Je suis très nouveau à ce sujet: -/ – mandroid

+1

Oui, c'est possible, et vous le faites correctement à condition que vous voulez instancier toutes les formes une fois au début, stocker les instances dans le dict et en affecter un à x . Si vous voulez seulement instancier la classe sélectionnée, ou si vous prévoyez d'instancier des formes individuelles plusieurs fois, utilisez quelque chose comme la réponse de Vinay. – Markus

Répondre

23

Presque. Ce que vous voulez est

shapes = {'1':Square, '2':Circle, '3':Triangle} # just the class names in the dict 

x = shapes[raw_input()]() # get class from dict, then call it to create a shape instance. 
+0

wow. Je ne sais pas que nous pouvons le faire. c'est tellement pythonique. merci Vinay sajip ... –

1

je recommande une fonction chooser:

def choose(optiondict, prompt='Choose one:'): 
    print prompt 
    while 1: 
     for key, value in sorted(optiondict.items()): 
      print '%s) %s' % (key, value) 
     result = raw_input() # maybe with .lower() 
     if result in optiondict: 
      return optiondict[result] 
     print 'Not an option' 

result = choose({'1': Square, '2': Circle, '3': Triangle})() 
Questions connexes