Bryan Ward
Bryan Ward

Reputation: 6693

Get subclass name?

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.

Upvotes: 24

Views: 20037

Answers (5)

Harsh Verma
Harsh Verma

Reputation: 923

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

Upvotes: 3

Jason Scheirer
Jason Scheirer

Reputation: 1698

SubFoo.__name__

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

Upvotes: 5

nate c
nate c

Reputation: 9005

#!/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.

Upvotes: 13

mykhal
mykhal

Reputation: 19905

you can use

SubFoo().__class__.__name__

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

Upvotes: 16

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 798606

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

class Foo(object):
  ....

Upvotes: 3

Related Questions