2014-06-19 3 views
-2

Je voudrais créer un dictionnaire qui, basé sur un mot-clé string, retourne une sous-classe de Foo que je peux instancier plus tard. Est-ce possible ou est-ce une approche incorrecte du problème?Instancier une classe par référence

Code Pseudo:

subclasses_of_foo = {"foo1": Foo1, "foo2": Foo2} 
subclass_of_foo = subclasses_of_foo["foo1"] 

instance = subclass_of_foo() 
+0

Ce n'est pas ce que veut dire «taper du canard» mais ça fonctionne. –

+0

Vous pouvez même faire 'instance = subclasses_of_foo [" foo1 "]()' si vous aimez – svvac

+0

Il est dactylographier si vous supprimez la partie de sous-classe à droite? (tant que j'ai l'intention d'appeler une méthode sur l'objet instancié) – SverkerSbrg

Répondre

1

Bien sûr, vous pouvez le faire. Essayez.

+0

Merci! Je venais de foirer l'ordre de la classe et de la définition de la classe. – SverkerSbrg

1

Votre approche est entièrement correcte et fonctionne. Les classes sont juste les objets, comme tout le reste en Python. Ils peuvent être stockés en tant que valeurs dans un dictionnaire.

Démo:

>>> class Foo: 
...  pass 
... 
>>> class Bar: 
...  pass 
... 
>>> classmap = {'foo': Foo, 'bar': Bar} 
>>> classmap['foo'] 
<class __main__.Foo at 0x107eee1f0> 
>>> classmap['foo']() 
<__main__.Foo instance at 0x107eefcb0> 

Notez que duck typing est tout autre chose; C'est la pratique de traiter n'importe quel objet comme le type correct à condition qu'il implémente les attributs et les méthodes que vous attendiez (s'il marche comme un canard, il est un canard).

+0

Merci! Je venais de foirer l'ordre de la classe et de la définition de la classe. – SverkerSbrg

Questions connexes