Python2でprintデバッグをした際、インスタンスの型名が知りたくなりました。
type()関数を使ったところ、<type 'instance'>
が返ってきたので、これは何だろうと思って調べた時のメモです。
type() | 2. 組み込み関数 — Python 2.7.x ドキュメント
環境
- Python 2.7.13
結果
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