Comment puis-je trouver un nom de classe qui a créé une instance d'un objet en Python si la fonction dont je fais cela est la classe de base dont la classe de l'instance a été dérivée?
Je pensais que le module d'inspection m'aurait peut-être aidé ici, mais il ne semble pas me donner ce que je veux. Et à moins d'analyser le __class__
membre, je ne sais pas comment obtenir ces informations.
Réponses:
Avez-vous essayé l'
__name__
attribut de la classe? c'est-àtype(x).__name__
- dire vous donnera le nom de la classe, qui je pense est ce que vous voulez.Si vous utilisez toujours Python 2, notez que la méthode ci-dessus fonctionne uniquement avec les classes de nouveau style (dans Python 3+ toutes les classes sont des classes de "nouveau style"). Votre code peut utiliser certaines classes à l'ancienne. Les travaux suivants pour les deux:
la source
dir(x.__class__)
me demande pourquoi ne l' énumère pas?__class__
latype
méthode? Comme ceci:type(x).__name__
. N'est-il pas directement déconseillé d'appeler des membres à double soulignement?__name__
Cependant, je ne vois pas comment contourner l'utilisation .__class__
directement pour être compatible avec les classes à l'ancienne, car leur type est justeinstance
.def typename(x): return type(x).__name__
Voulez-vous que le nom de la classe soit une chaîne?
la source
type ()?
la source
self.__class__.__name__
au lieu d'type(self).__name__
obtenir le même comportement. À moins qu'il y ait quelque chose que latype()
fonction fait que je ne sache pas?type(item)
un élément de liste, le résultat sera alors<type 'instance'>
queitem.__class__.__name__
contient le nom de la classe.L'exemple de code ci-dessus (lorsqu'il est entré dans l'interpréteur interactif) produira
'__main__.A'
par opposition à celui'A'
qui est produit si l'__name__
attribut est appelé. En passant simplement le résultat deA.__class__
austr
constructeur, l'analyse est gérée pour vous. Cependant, vous pouvez également utiliser le code suivant si vous souhaitez quelque chose de plus explicite.Ce comportement peut être préférable si vous avez des classes avec le même nom définies dans des modules séparés.
L'exemple de code fourni ci-dessus a été testé en Python 2.7.5.
la source
Exemple:
la source
Bonne question.
Voici un exemple simple basé sur les GHZ qui pourrait aider quelqu'un:
la source
Vous pouvez également utiliser le
classmethod
décorateur:Utilisation :
la source
En plus de saisir l'
__name__
attribut spécial , vous pourriez avoir besoin du nom qualifié pour une classe / fonction donnée. Cela se fait en saisissant les types__qualname__
.Dans la plupart des cas, ceux-ci seront exactement les mêmes, mais, lorsqu'ils traitent avec des classes / méthodes imbriquées, elles diffèrent dans la sortie que vous obtenez. Par exemple:
Puisque l'introspection est ce que vous recherchez, c'est toujours ce que vous voudrez peut-être considérer.
la source
__qualname__
c'est pour Python 3.3+__qualname__
vs__name__
: stackoverflow.com/questions/58108488/what-is-qualname-in-pythonPour obtenir le nom de classe de l'instance:
ou
les deux sont les mêmes
la source