Python Tips: type() と isinstance() をうまく使い分けたい

Python には type()isinstance() というよく似た関数が存在します。今回はそれらの使い分け方法についてご紹介します。

結論からいうと次のようなちがいがあります。

  • type(): そのインスタンスを生成したクラスを返す
  • isinstance(): ふたつの引数がオブジェクトとクラスの関係にあるかどうかを返す
class Onitsuka(object):
    pass

class Puma(Onitsuka):
    pass

p1 = Puma()

# type() はそのインスタンスのクラスを返す
print(type(p1) == Puma)      # => True
print(type(p1) == Onitsuka)  # => False

# isinstance() はスーパークラスも含めてチェックする
print(isinstance(p1, Puma))      # => True
print(isinstance(p1, Onitsuka))  # => True

以上です。

ちなみにクラス間の継承関係をチェックしたいときには issubclass() 関数やクラスメソッド mro() が有用です。