Dostajesz nazwę klasy instancji?

Jak mogę znaleźć nazwę klasy, która utworzyła instancję obiektu w Pythonie, jeśli funkcja, z której to robię, jest klasą bazową, z której wywodzi się Klasa instancji?

Myślałem, że może moduł inspect mógłby mi pomóc, ale nie wydaje mi się, żeby dał mi to, czego chcę. A poza analizowaniem członka __class__, nie jestem pewien, jak zdobyć te informacje.

Author: martineau, 2009-02-04

8 answers

Czy próbowałeś __name__ atrybutu klasy? ie type(x).__name__ da Ci nazwę klasy, która według mnie jest tym, czego chcesz.

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

Ta metoda działa tylko zklasami nowego stylu . Twój kod może używać klas w starym stylu. Następujące działa dla obu:

x.__class__.__name__
 1398
Author: sykora,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-11 05:59:26

Czy chcesz, aby nazwa klasy była ciągiem znaków?

instance.__class__.__name__
 287
Author: truppo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-04 12:02:16

Type() ?

>>> class A(object):
...    def whoami(self):
...       print type(self).__name__
...
>>>
>>> class B(A):
...    pass
...
>>>
>>>
>>> o = B()
>>> o.whoami()
'B'
>>>
 72
Author: GHZ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-04 13:57:51
class A:
  pass

a = A()
str(a.__class__)

Powyższy przykładowy kod (gdy jest wprowadzany w interpreterze interaktywnym) będzie wytwarzał '__main__.A' w przeciwieństwie do 'A', który jest wytwarzany, jeśli zostanie wywołany atrybut __name__. Po prostu przekazując wynik A.__class__ konstruktorowi str, parsowanie jest obsługiwane za Ciebie. Możesz jednak użyć poniższego kodu, jeśli chcesz czegoś bardziej wyraźnego.

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

To zachowanie może być preferowane, jeśli masz klasy o tej samej nazwie zdefiniowane w oddzielnych modułach.

Próbka kod podany powyżej został przetestowany w Pythonie 2.7.5.

 26
Author: Jonathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-09 23:04:17
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):
  ...

Przykład:

>>> 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'
>>>
 24
Author: Prasath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-30 05:56:01

Dobre pytanie.

Oto prosty przykład oparty na GHZ, który może komuś pomóc:

>>> 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
 13
Author: RyanN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-21 19:07:40

Poza chwytaniem specjalnego __name__ atrybut, być może będziesz potrzebował kwalifikowanej nazwy dla danej klasy/funkcji. Odbywa się to poprzez pobranie typów __qualname__.

W większości przypadków będą one dokładnie takie same, ale w przypadku zagnieżdżonych klas/metod różnią się one uzyskanym wynikiem. Na przykład:

class Spam:
    def meth(self):
        pass
    class Bar:
        pass

>>> s = Spam()
>>> type(s).__name__ 
'Spam'
>>> type(s).__qualname__
'Spam'
>>> type(s).Bar.__name__       # type not needed here
'Bar'
>>> type(s).Bar.__qualname__   # type not needed here 
'Spam.Bar'
>>> type(s).meth.__name__
'meth'
>>> type(s).meth.__qualname__
'Spam.meth'
Ponieważ introspekcja jest tym, czego szukasz, zawsze możesz to rozważyć.
 4
Author: Jim Fasarakis Hilliard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-12 15:01:54

Alternatywnie możesz użyć dekoratora classmethod:

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

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

Użycie :

>>> A.get_classname()
'A'
>>> a = A()
>>> a.get_classname()
'A'
>>> a.use_classname()
'A'
 4
Author: Yurii Rabeshko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-29 21:13:56