2032

How do I find out the name of the class used to create an instance of an object in Python?

I'm not sure if I should use the inspect module or parse the __class__ attribute.

Mateen Ulhaq
27.9k21 gold badges122 silver badges155 bronze badges
asked Feb 4, 2009 at 11:37
2
  • What exactly are you 'parsing' from the class variable? Commented Feb 4, 2009 at 11:49
  • 3
    the top-level name of the class that the instance belongs to (without module name, etc...) Commented Feb 4, 2009 at 11:50

12 Answers 12

2637

Have you tried the __name__ attribute of the class? ie type(x).__name__ will give you the name of the class, which I think is what you want.

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

If you're still using Python 2, note that the above method works with new-style classes only (in Python 3+ all classes are "new-style" classes). Your code might use some old-style classes. The following works for both:

x.__class__.__name__
answered Feb 4, 2009 at 12:02
Sign up to request clarification or add additional context in comments.

12 Comments

Amazingly simple. Wonder why dir(x.__class__) does not list it?
Why use __class__ over the type method? Like so: type(x).__name__. Isn't calling double underscore members directly discouraged? I can't see a way around using __name__, though.
You have to use __class__ directly to be compatible with old-style classes, since their type is just instance.
This is used often enough in logging, orm and framework code that there really should be a builtin typename(x) ... requiring a user to look at the "guts" to get a name isn't terribly pythonic, IMO.
@ErikAronesty, def typename(x): return type(x).__name__
|
575

Do you want the name of the class as a string?

instance.__class__.__name__
answered Feb 4, 2009 at 12:02

8 Comments

Or instance.__class__ to get the class object :D
Is it safe to use double underscore properties?
@EduardLuca why wouldn't it be safe? Built-in properties use underscores so that they do not cause any conflict with the code you write
Well I know that single underscores mean / suggest that the method / property should be private (although you can't really implement private methods in Python AFAIK), and I was wondering if that's not the case with (some) double underscores too.
@EduardLuca Double underscores at the start only are similar to a single underscore at the start, but even more "private" (look up "python name mangling"). Double underscores at beginning and end are different - those are reserved for python and are not private (e.g. magic methods like __init__ and __add__).
|
193

type() ?

>>> class A:
... def whoami(self):
... print(type(self).__name__)
...
>>>
>>> class B(A):
... pass
...
>>>
>>>
>>> o = B()
>>> o.whoami()
'B'
>>>
answered Feb 4, 2009 at 11:42

5 Comments

I like this one. This way, it is possible in a base class to get the name of the subclass.
or self.__class__.__name__ instead of type(self).__name__ to get the same behaviour. Unless there is something the type() function does that I am not aware of?
If you're using type(item) on a list item the result will be <type 'instance'> while item.__class__.__name__ holds the class name.
I think the issue that @Grochni mentions is only relevant for certain classes in Python 2.x, see here: stackoverflow.com/questions/6666856/…
@andreb The original solution is shorter.
53
class A:
 pass
a = A()
str(a.__class__)

The sample code above (when input in the interactive interpreter) will produce '__main__.A' as opposed to 'A' which is produced if the __name__ attribute is invoked. By simply passing the result of A.__class__ to the str constructor the parsing is handled for you. However, you could also use the following code if you want something more explicit.

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

This behavior can be preferable if you have classes with the same name defined in separate modules.

The sample code provided above was tested in Python 2.7.5.

answered Jun 9, 2014 at 23:04

Comments

32

In Python 2,

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):
 ...

Example:

>>> 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'
>>>
wjandrea
34k10 gold badges69 silver badges107 bronze badges
answered Apr 30, 2013 at 5:50

1 Comment

This only holds true for old Python 2.x. In 3.x, bclass() would resolve to bclass(object). And even then, new classes appeared in Python 2.2.
27

Alternatively you can use the classmethod decorator:

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

Usage:

>>> A.get_classname()
'A'
>>> a = A()
>>> a.get_classname()
'A'
>>> a.use_classname()
'A'
answered Sep 13, 2017 at 19:11

Comments

20

Apart from grabbing the special __name__ attribute, you might find yourself in need of the qualified name for a given class/function. This is done by grabbing the types __qualname__.

In most cases, these will be exactly the same, but, when dealing with nested classes/methods these differ in the output you get. For example:

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'

Since introspection is what you're after, this is always you might want to consider.

answered Jul 12, 2017 at 15:01

3 Comments

Should be noted that __qualname__ is for Python 3.3+
And I would avoid naming anything in my software "meth".
Related explanation for __qualname__ vs __name__: stackoverflow.com/questions/58108488/what-is-qualname-in-python
17

Good question.

Here's a simple example based on GHZ's which might help someone:

>>> 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
answered Feb 21, 2012 at 19:07

Comments

13

You can simply use __qualname__ which stands for qualified name of a function or class

Example:

>>> class C:
... class D:
... def meth(self):
... pass
...
>>> C.__qualname__
'C'
>>> C.D.__qualname__
'C.D'
>>> C.D.meth.__qualname__
'C.D.meth'

documentation link qualname

answered Nov 15, 2020 at 10:12

2 Comments

this gives the name of a class not the class name of an instance
This was already suggested by @Dimitris in 2017
9

To get instance classname:

type(instance).__name__

or

instance.__class__.__name__

both are the same

answered May 21, 2020 at 15:03

1 Comment

Actually they can be different if the class overrides __class__, or in old style classes (which are obsolete)
1

If you're looking to solve this for a list (or iterable collection) of objects, here's how I would solve:

from operator import attrgetter
# Will use a few data types to show a point
my_list = [1, "2", 3.0, [4], object(), type, None]
# I specifically want to create a generator
my_class_names = list(map(attrgetter("__name__"), map(type, my_list))))
# Result:
['int', 'str', 'float', 'list', 'object', 'type', 'NoneType']
# Alternatively, use a lambda
my_class_names = list(map(lambda x: type(x).__name__, my_list))
answered Dec 22, 2022 at 17:21

Comments

-1

You can first use type and then str to extract class name from it.

class foo:pass;
bar:foo=foo();
print(str(type(bar))[8:-2][len(str(type(bar).__module__))+1:]);

Result

foo
answered Sep 18, 2022 at 9:33

4 Comments

That's hard to read, are those inline methods I don't know about?
If I came across a line such as this, I'd definitely "annotate" the code just to know the name of whom I was going to swear a lot.
Or just use type(bar).__qualname__
Too "magical", not readable :)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.