Question

Je veux savoir comment utiliser les variables pour les objets et les noms de fonction en Python. En PHP, vous pouvez faire ceci:

$className = "MyClass";

$newObject = new $className();

Comment faites-vous ce genre de chose en Python? Ou est-ce que je n'apprécie absolument pas une différence fondamentale avec Python, et si oui, de quoi s'agit-il?

Était-ce utile?

La solution

En Python,

className = MyClass
newObject = className()

La première ligne fait que la variable className fait référence à la même chose que MyClass . La ligne suivante appelle ensuite le constructeur MyClass via la variable className .

À titre d'exemple concret:

>>> className = list
>>> newObject = className()
>>> newObject
[]

(En Python, list est le constructeur de la classe list .)

La différence est qu'en PHP, vous représentez le nom de la classe à laquelle vous souhaitez faire référence en tant que chaîne, alors qu'en Python, vous pouvez référencer directement la même classe. Si vous devez utiliser une chaîne (par exemple, si le nom de la classe est créé de manière dynamique), vous devrez utiliser d'autres techniques.

Autres conseils

En supposant que some_module ait une classe nommée "quot_name":

import some_module
klass = getattr(some_module, "class_name")
some_object = klass()

Je dois noter que vous devez faire attention ici: transformer des chaînes en code peut être dangereux si la chaîne provient de l'utilisateur. Vous devez donc garder la sécurité à l'esprit dans cette situation. :)

Une autre méthode (en supposant que nous utilisions toujours "quot_name"):

class_lookup = { 'class_name' : class_name }
some_object = class_lookup['class_name']()  #call the object once we've pulled it out of the dict

Cette dernière méthode est probablement le moyen le plus sûr de le faire. C'est donc ce que vous devriez utiliser si possible.

Si vous avez besoin de créer une classe dynamique en Python (c'est-à-dire une classe dont le nom est une variable), vous pouvez utiliser type () qui prend 3 paramètres: nom, bases, attrs

>>> class_name = 'MyClass'
>>> klass = type(class_name, (object,), {'msg': 'foobarbaz'})

<class '__main__.MyClass'>

>>> inst = klass()
>>> inst.msg
foobarbaz
  • Notez cependant que cela n’instancie pas l’objet (c’est-à-dire qu’il n’appelle pas les constructeurs, etc. Il crée une nouvelle classe (!) portant le même nom.

Si vous avez ceci:

class MyClass:
    def __init__(self):
        print "MyClass"

Ensuite, vous faites habituellement ceci:

>>> x = MyClass()
MyClass

Mais vous pouvez aussi faire ceci, et c'est ce que je pense que vous demandez:

>>> a = "MyClass"
>>> y = eval(a)()
MyClass

Mais, faites très attention à l'endroit où vous obtenez la chaîne que vous utilisez " eval () " sur - si cela vient de l'utilisateur, vous créez essentiellement un énorme trou de sécurité.

Mise à jour: L'utilisation de type () , comme indiqué dans la réponse de coleifer, est de loin supérieure à cette solution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top