Pregunta

Quiero saber cómo usar variables para objetos y nombres de funciones en Python. En PHP, puedes hacer esto:

$className = "MyClass";

$newObject = new $className();

¿Cómo haces este tipo de cosas en Python? O, ¿no estoy apreciando totalmente alguna diferencia fundamental con Python, y si es así, qué es?

¿Fue útil?

Solución

En Python,

className = MyClass
newObject = className()

La primera línea hace que la variable className se refiera a lo mismo que MyClass . Luego, la siguiente línea llama al constructor MyClass a través de la variable className .

Como ejemplo concreto:

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

(En Python, list es el constructor de la clase list .)

La diferencia es que en PHP, usted representa el nombre de la clase a la que desea referirse como una cadena, mientras que en Python puede hacer referencia a la misma clase directamente. Si debe usar una cadena (por ejemplo, si el nombre de la clase se crea de forma dinámica), deberá usar otras técnicas.

Otros consejos

Suponiendo que some_module tiene una clase llamada " class_name " ;:

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

Debo tener en cuenta que debe tener cuidado aquí: convertir cadenas en código puede ser peligroso si la cadena proviene del usuario, por lo que debe tener en cuenta la seguridad en esta situación. :)

Otro método (suponiendo que todavía estemos usando " class_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

El último método es probablemente la forma más segura de hacer esto, por lo que probablemente sea lo que deberías usar si es posible.

Si necesita crear una clase dinámica en Python (es decir, una cuyo nombre es una variable) puede usar type () que toma 3 parámetros: nombre, bases, atributos

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

<class '__main__.MyClass'>

>>> inst = klass()
>>> inst.msg
foobarbaz
  • Sin embargo, tenga en cuenta que esto no 'crea una instancia' del objeto (es decir, no llama a los constructores, etc. Crea una nueva clase (!) con el mismo nombre.

Si tienes esto:

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

Entonces usualmente haces esto:

>>> x = MyClass()
MyClass

Pero también puedes hacer esto, que es lo que creo que estás preguntando:

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

Pero, tenga mucho cuidado de dónde obtiene la cadena que utiliza " eval () " encendido: si proviene del usuario, básicamente estás creando un enorme agujero de seguridad.

Actualización: el uso de type () como se muestra en la respuesta de Coleifer es muy superior a esta solución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top