Actualmente estoy escribiendo un módulo de serialización en Python que puede serializar clases definidas por el usuario. para hacer esto, necesito obtener el espacio de nombre completo del objeto y escribirlo en un archivo. Puedo usar esa cadena para recrear el objeto.obteniendo la ruta de clase o espacio de nombre de una clase en python, incluso si está anidado
por ejemplo, suponer que tenemos la estructura de la clase siguiente en un archivo denominado A.py
class B:
class C:
pass
ahora con la suposición de que my_klass_string
es la cadena "A::B::C"
klasses = my_klass_string.split("::")
if globals().has_key(klasses[0]):
klass = globals()[klasses[0]]
else:
raise TypeError, "No class defined: %s} " % klasses[0]
if len(klasses) > 1:
for klass_string in klasses:
if klass.__dict__.has_key(klass_string):
klass = klass.__dict__[klass_string]
else:
raise TypeError, "No class defined: %s} " % klass_string
klass_obj = klass.__new__(klass)
puedo crear una instancia de la clase C aunque se encuentra en la clase B
en el módulo A
. el código anterior es equivalente a llamar eval(klass_obj = A.B.C.__new__(A.B.C))
nota: estoy usando __new__()
aquí porque estoy reconstitución de un objeto serializado y no quiero a inicializar el objeto como no sé qué parámetros de la clase __init__
métodos toma. Quiero crear el objeto sin llamar init y luego asignar atributos a él más tarde.
de cualquier manera que pueda crear un objeto de la clase A.B.C
de una cadena. ¿Cómo voy por el otro lado? ¿Cómo obtengo una cadena que describe la ruta completa a la clase desde una instancia de esa clase, incluso si la clase está anidada?
+1 para una pregunta interesante y bien explicada. –