Comment obtenir le nom de la classe dans laquelle je suis actuellement?
Exemple:
def get_input(class_name):
[do things]
return class_name_result
class foo():
input = get_input([class name goes here])
En raison de la nature du programme avec lequel je m'interface (vistrails), je ne peux pas utiliser __init__()
pour initialiser input
.
getName
partir d'une classe enfant, il affichera le nom de la classe enfant. Cela devient alors délicat si vous voulez VRAIMENT la classe avec laquelle vous travaillez.getName
depuis une classe parent, le nom de la classe enfant sera affiché ? Ok ty pour le signaler.getName()
méthode est définie dans une superclasse) est correcte.Dans le corps d'une classe, le nom de la classe n'est pas encore défini, il n'est donc pas disponible. Ne pouvez-vous pas simplement taper le nom de la classe? Peut-être avez-vous besoin d'en dire plus sur le problème afin que nous puissions trouver une solution pour vous.
Je créerais une métaclasse pour faire ce travail pour vous. Il est appelé au moment de la création de la classe (conceptuellement à la toute fin de la classe: block), et peut manipuler la classe en cours de création. Je n'ai pas testé ceci:
la source
MyType
dans lasuper
ligneInputAssigningMetaclass
?Vous pouvez y accéder par les attributs privés de la classe:
ÉDITER:
Comme indiqué par
Ned Batcheler
, cela ne fonctionnerait pas dans le corps de la classe, mais dans une méthode.la source
PEP 3155 introduit
__qualname__
, qui a été implémenté dans Python 3.3.Il est accessible depuis la définition même d'une classe ou d'une fonction, donc par exemple:
imprimera efficacement
Foo
. Vous obtiendrez le nom complet (à l'exclusion du nom du module), vous voudrez peut-être le diviser sur le.
personnage.Cependant, il n'existe aucun moyen d'obtenir un handle réel sur la classe en cours de définition.
la source
EDIT: Oui, vous pouvez; mais vous devez tricher: le nom de la classe en cours d'exécution est présent sur la pile d'appels, et le
traceback
module vous permet d'accéder à la pile.Cependant, je ne ferais pas cela; Ma réponse initiale est toujours ma propre préférence comme solution. Réponse originale:
probablement la solution la plus simple est d'utiliser un décorateur, qui est similaire à la réponse de Ned impliquant des métaclasses, mais moins puissant (les décorateurs sont capables de magie noire, mais les métaclasses sont capables de magie noire ancienne et occulte )
la source
la source
Je pense que ça devrait être comme ça:
la source