Getting the class name of an instance in Python

またの名を、インスタンスを手持ちな場合に class の名前が欲しーの。

Python 2.x まではちょっと繊細な問題もあり。

 1 # this example for Python from 2.2 to 2.7
 2 class OldStyleClass:
 3     pass
 4 
 5 class NewStyleClass(object):
 6     pass
 7 
 8 oscobj = OldStyleClass()
 9 nscobj = NewStyleClass()
10 
11 print(oscobj.__class__.__name__)  # => OldStyleClass
12 print(nscobj.__class__.__name__)  # => NewStyleClass
13 print(type(oscobj).__name__)      # => instance
14 print(type(nscobj).__name__)      # => NewStyleClass
15 #print(5.__class__.__name__)      # of cource, this causes SyntaxError
16 print((5).__class__.__name__)     # => int
17 print(type(5).__name__)           # => int
18 print([].__class__.__name__)      # => list
19 print(type([]).__name__)          # => list
20 print(().__class__.__name__)      # => tuple
21 print(type(()).__name__)          # => tuple

まず、特に理由がない場合は「旧形式 class」(objectを派生しない class)は書くべきではない。これは、チームで物作りする場合は、規約で決めるとかした方がいいよ。

ただ、旧形式 class が世の中に実在しない、というもんでもないので、移植性を考えれば、

1 obj.__class__.__name__

とするしかないでしょうな。これはやりたくないよね:

1 res = type(obj).__name__
2 if res == 'instance':
3     res = obj.__class__.__name__