nombres metodos importar clases python dynamic-typing

metodos - ¿Cómo usar las variables para nombres de clase en Python?



metodos en python (4)

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

>>> 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 constructores, etc. Crea una nueva clase (!) Con el mismo nombre.

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 por completo alguna diferencia fundamental con Python, y si es así, qué es?


En Python,

className = MyClass newObject = className()

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

Como un ejemplo concreto:

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

(En Python, list es el constructor para la clase de 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 directamente a la misma clase. Si debe usar una cadena (por ejemplo, si el nombre de la clase se crea dinámicamente), necesitará usar otras técnicas.


Suponiendo que some_module tiene una clase llamada "class_name":

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

Debo señalar 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 (asumiendo que todavía estamos 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 hacerlo, por lo que es probablemente lo que debe usar si es posible.


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 con la cadena en la que utiliza "eval ()", si proviene del usuario, básicamente está creando un enorme vacío de seguridad.

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