Get subclass name?

Question:

Is it possible to get the name of a subclass? For example:

class Foo:
    def bar(self):
        print type(self)

class SubFoo(Foo):
    pass

SubFoo().bar()

will print: < type 'instance' >

I’m looking for a way to get "SubFoo".

I know you can do isinstance, but I don’t know the name of the class a priori, so that doesn’t work for me.

Asked By: Bryan Ward

||

Answers:

It works a lot better when you use new-style classes.

class Foo(object):
  ....

you can use

SubFoo().__class__.__name__

which might be off-topic, since it gives you a class name 🙂

Answered By: mykhal
#!/usr/bin/python
class Foo(object):
  def bar(self):
    print type(self)

class SubFoo(Foo):
  pass

SubFoo().bar()

Subclassing from object gives you new-style classes (which are not so new any more – python 2.2!) Anytime you want to work with the self attribute a lot you will get a lot more for your buck if you subclass from object. Python’s docs … new style classes. Historically Python left the old-style way Foo() for backward compatibility. But, this was a long time ago. There is not much reason anymore not to subclass from object.

Answered By: nate c

SubFoo.__name__

And parents: [cls.__name__ for cls in SubFoo.__bases__]

Answered By: Jason Scheirer

Just a reminder that this issue doesn’t exist in Python 3.x and
print(type(self)) will give the more informative <class '__main__.SubFoo'> instead of bad old < type 'instance' >.

This is because object is subclassed automatically in Python 3.x, making every class a new-style class.

More discussion at What is the purpose of subclassing the class "object" in Python?.

Like others pointed out, to just get the subclass name do print(type(self).__name__).

Answered By: Harsh Verma
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.