lister - Obtenir le nom de classe d'une instance en Python




python lister les attributs d'une classe (6)

Avez-vous essayé l'attribut __name__ de la classe? ie type(x).__name__ vous donnera le nom de la classe, ce que je pense est ce que vous voulez.

>>> import itertools
>>> x = itertools.count(0)
>>> type(x).__name__
'count'

Cette méthode fonctionne uniquement avec les classes de style nouveau . Votre code peut utiliser des classes de style ancien. Les travaux suivants pour les deux:

x.__class__.__name__

Comment puis-je trouver un nom de classe qui a créé une instance d'un objet dans Python si la fonction à partir de laquelle je fais cela est la classe de base dont la classe de l'instance a été dérivée?

Pensait peut - être que le module d'inspection aurait pu m'aider ici, mais il ne semble pas me donner ce que je veux. Et à court d'analyser le membre __class__ , je ne suis pas sûr de savoir comment obtenir cette information.


Bonne question.

Voici un exemple simple basé sur GHZ qui pourrait aider quelqu'un:

>>> class person(object):
        def init(self,name):
            self.name=name
        def info(self)
            print "My name is {0}, I am a {1}".format(self.name,self.__class__.__name__)
>>> bob = person(name='Robert')
>>> bob.info()
My name is Robert, I am a person

Voulez-vous le nom de la classe en tant que chaîne?

instance.__class__.__name__

Vous pouvez également utiliser le classmethod :

class A:
    @classmethod
    def get_classname(cls):
        return cls.__name__

    def use_classname(self):
        return self.get_classname()

Utilisation :

>>> A.get_classname()
'A'
>>> a = A()
>>> a.get_classname()
'A'
>>> a.use_classname()
'A'

class A:
  pass

a = A()
str(a.__class__)

L'exemple de code ci-dessus (lorsqu'il est entré dans l'interpréteur interactif) produira '__main__.A' par opposition à 'A' qui est produit si l'attribut __name__ est invoqué. En passant simplement le résultat de A.__class__ au constructeur str l'analyse est gérée pour vous. Cependant, vous pouvez également utiliser le code suivant si vous voulez quelque chose de plus explicite.

"{0}.{1}".format(a.__class__.__module__,a.__class__.__name__)

Ce comportement peut être préférable si vous avez des classes avec le même nom défini dans des modules distincts.

L'exemple de code fourni ci-dessus a été testé en Python 2.7.5.


type(instance).__name__ != instance.__class__.__name  #if class A is defined like
class A():
   ...

type(instance) == instance.__class__                  #if class A is defined like
class A(object):
  ...

Exemple:

>>> class aclass(object):
...   pass
...
>>> a = aclass()
>>> type(a)
<class '__main__.aclass'>
>>> a.__class__
<class '__main__.aclass'>
>>>
>>> type(a).__name__
'aclass'
>>>
>>> a.__class__.__name__
'aclass'
>>>


>>> class bclass():
...   pass
...
>>> b = bclass()
>>>
>>> type(b)
<type 'instance'>
>>> b.__class__
<class __main__.bclass at 0xb765047c>
>>> type(b).__name__
'instance'
>>>
>>> b.__class__.__name__
'bclass'
>>>




python-datamodel