objetos - llamar metodo de otra clase python
Crea una instancia de una clase de Python a partir de un nombre (6)
En tu caso puedes usar algo como
get_class = lambda x: globals()[x]
c = get_class("foo")
Y es aún más fácil no obtener clase del módulo.
import somemodule
getattr(somemodule, "SomeClass")
Esta pregunta ya tiene una respuesta aquí:
- Python: ¿Referencia a una clase de una cadena? 3 respuestas
Así que tengo un conjunto de clases y una cadena con uno de los nombres de clase. ¿Cómo puedo crear una instancia de una clase basada en esa cadena?
class foo:
def __init__(self, left, right):
self.left = left
self.right = right
str = "foo"
x = Init(str, A, B)
Quiero que x sea una instanciación de la clase foo.
Si conoce el espacio de nombres involucrado, puede usarlo directamente; por ejemplo, si todas las clases están en el módulo zap
, el diccionario vars(zap)
es ese espacio de nombres; si están todos en el módulo actual, globals()
es probablemente la forma más fácil de obtener ese diccionario.
Si las clases no están todas en el mismo espacio de nombres, entonces construir un espacio de nombres "artificial" (un dictado dedicado con nombres de clase como claves y objetos de clase como valores), como sugiere @Ignacio, es probablemente el enfoque más simple.
También podría considerar el uso de metaclase:
Cls = type(''foo'', (), foo.__dict__)
x = Cls(A, B)
Sin embargo, crea otra clase similar.
prueba esto
cls = __import__(''cls_name'')
y esto: http://effbot.org/zone/import-confusion.htm puede ser útil
classdict = {''foo'': foo}
x = classdict[''foo''](A, B)
classname = "Foo"
foo = vars()[classname](Bar, 0, 4)
O quizás
def mkinst(cls, *args, **kwargs):
try:
return globals()[cls](*args, **kwargs)
except:
raise NameError("Class %s is not defined" % cls)
x = mkinst("Foo", bar, 0, 4, disc="bust")
y = mkinst("Bar", foo, batman="robin")
Notas misceláneas sobre el fragmento:
*args
y **kwargs
son parámetros especiales en Python, significan "una serie de **kwargs
sin palabra clave" y "un dict de argumentos palabra clave" en consecuencia.
PEP-8 (guía de estilo oficial de Python) recomienda usar cls
para las variables de clase.
vars()
devuelve un dict de variables definidas en el ámbito local.
globals()
devuelve un dictado de variables actualmente presentes en el entorno fuera del ámbito local.