読者です 読者をやめる 読者になる 読者になる

Python2で、type()関数を使うと<type 'instance'>が返ってきた

Python2でprintデバッグをした際、インスタンスの型名が知りたくなりました。

type()関数を使ったところ、<type 'instance'>が返ってきたので、これは何だろうと思って調べた時のメモです。
type() | 2. 組み込み関数 — Python 2.7.x ドキュメント

 

環境

 

結果

Python2で古い形式でクラス定義をしていると、type()関数では<type 'instance'>が返ってくるようでした。
python - Why does type(myField) return <type 'instance'> and not <type 'Field'>? - Stack Overflow

 
そのため、<インスタンス>.__class__のように__class__属性を使うのが良いとのことです。
instance.class | 5. 組み込み型 — Python 2.7.x ドキュメント

 
ためしてみます。

type_instance.py

# -*- coding:utf-8 -*-

class Py2OldStyle1:
    pass

class Py2OldStyle2():
    pass
    
class Py2NewStyle(object):
    pass


if __name__ == "__main__":
    print('Python2の古い形式1: {}'.format(type(Py2OldStyle1())))
    print('Python2の古い形式2: {}'.format(type(Py2OldStyle2())))
    print('Python2の新しい形式: {}'.format(type(Py2NewStyle())))
    print('Python2の古い形式1で__class__を使う: {}'.format(Py2OldStyle1().__class__))
    print('Python2の古い形式2で__class__を使う: {}'.format(Py2OldStyle2().__class__))
    print('Python2の新しい形式で__class__を使う: {}'.format(Py2NewStyle().__class__))

 
実行してみます。

# Python 2.xの確認
$ python --version
Python 2.7.13

# 実行
$ python type_instance.py 
Python2の古い形式1: <type 'instance'>
Python2の古い形式2: <type 'instance'>
Python2の新しい形式: <class '__main__.Py2NewStyle'>
Python2の古い形式1で__class__を使う: __main__.Py2OldStyle1
Python2の古い形式2で__class__を使う: __main__.Py2OldStyle2
Python2の新しい形式で__class__を使う: <class '__main__.Py2NewStyle'>

__class__でクラス名を取得できました。

 
ちなみに、Python3.x系でも試してみたところ、

$ python --version
Python 3.6.0

$ python type_instance.py 
Python2の古い形式1: <class '__main__.Py2OldStyle1'>
Python2の古い形式2: <class '__main__.Py2OldStyle2'>
Python2の新しい形式: <class '__main__.Py2NewStyle'>
Python2の古い形式1で__class__を使う: <class '__main__.Py2OldStyle1'>
Python2の古い形式2で__class__を使う: <class '__main__.Py2OldStyle2'>
Python2の新しい形式で__class__を使う: <class '__main__.Py2NewStyle'>

となりました。

 
Python2.xの旧形式の表記は、Python3.xでは新形式の省略形として扱えるので、上記のような結果となりました。
Python class inherits object - Stack Overflow