¿Cómo obtengo el nombre de la clase en la que estoy actualmente?
Ejemplo:
def get_input(class_name):
[do things]
return class_name_result
class foo():
input = get_input([class name goes here])
Debido a la naturaleza del programa con el que estoy interactuando (vistrails), no puedo usar __init__()
para inicializar input
.
getName
desde una clase secundaria, se generará el nombre de la clase secundaria. Entonces se vuelve complicado si REALMENTE desea la clase con la que está trabajando.getName
desde una clase principal , se mostrará el nombre de la clase secundaria? Está bien por señalar eso.getName()
método está definido en una superclase) es correcta.Dentro del cuerpo de una clase, el nombre de la clase aún no está definido, por lo que no está disponible. ¿No puedes simplemente escribir el nombre de la clase? Tal vez necesite decir más sobre el problema para que podamos encontrar una solución para usted.
Crearía una metaclase para hacer este trabajo por ti. Se invoca en el momento de la creación de la clase (conceptualmente al final de la clase: bloque) y puede manipular la clase que se está creando. No he probado esto:
fuente
MyType
lasuper
línea enInputAssigningMetaclass
?Puede acceder a él mediante los atributos privados de la clase:
EDITAR:
Como dijo
Ned Batcheler
, esto no funcionaría en el cuerpo de la clase, pero sí en un método.fuente
Se introdujo PEP 3155
__qualname__
, que se implementó en Python 3.3.Es accesible desde la propia definición de una clase o función, por ejemplo:
imprimirá efectivamente
Foo
. Obtendrá el nombre completo (excluyendo el nombre del módulo), por lo que es posible que desee dividirlo en el.
personaje.Sin embargo, no hay forma de obtener un control real de la clase que se está definiendo.
fuente
EDITAR: Sí, puedes; pero tienes que hacer trampa: el nombre de la clase que se está ejecutando actualmente está presente en la pila de llamadas y el
traceback
módulo te permite acceder a la pila.Sin embargo, yo no haría esto; Mi respuesta original sigue siendo mi propia preferencia como solución. Respuesta original:
probablemente la solución más simple es usar un decorador, que es similar a la respuesta de Ned que involucra metaclases, pero menos poderosa (los decoradores son capaces de magia negra, pero las metaclases son capaces de magia negra antigua y oculta )
fuente
fuente
Creo que debería ser así:
fuente