5
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Python 型判定で使える組み込み関数 type()とisinstance()をまとめた

Posted at

型を調べたいときに使える組み込み関数として、type()とisinstance()があります。
それぞれの使い方、違いについて簡単にまとめました。
※実行したバージョンはPython3.7.3です。

type()

引数に調べたいオブジェクトを渡すと結果が返ってきます。

>>> a = 1
>>> type(a)
<class 'int'>

型判定するとこんな感じ

>>> type(a) == int
True
>>> type(a) == list
False

型が一致するとTrue、一致しなければFalseになります。
引数で指定したオブジェクトが判定対象のサブクラスだった場合はどうなるのでしょうか?

試してみる

>>> class MySuperClass(object):
...     pass
...
>>> class MyClass(MySuperClass):
...     pass

>>> my_class = MyClass()
>>> type(my_class) == MyClass
True
>>> type(my_class) == MySuperClass
False

引数で指定したオブジェクトがサブクラスのインスタンスだった場合、Falseが返ります。
サブクラスの場合は一致しないと判断されるのですね。

isinstance()

引数を2つとり、判定結果がboolで返ります。

>>> a = 1
>>> isinstance(a, int)
True

第一引数で指定したオブジェクトが第二引数のサブクラスのインスタンスの場合はどうなるのでしょうか?

試してみる

>>> class MySuperClass(object):
...     pass
...
>>> class MyClass(MySuperClass):
...     pass
...
>>> my_class = MyClass()
>>> isinstance(my_class, MyClass)
True 
>>> isinstance(my_class, MySuperClass)
True

第一引数が第二引数のクラスのインスタンス、またはサブクラスのインスタンスだった場合、Trueが返ります。

ちなみに、第二引数ではオブジェクトのタプルを指定することもできます。
タプル内クラスのいずれかのインスタンス、またはサブクラスのインスタンスだった場合Trueが返ります。

>>> b = True
# bはboolオブジェクトなのでTrue
>>> isinstance(b, (bool,str))
True
>>> isinstance(b, (float,str))
False
# boolはintのサブクラスなのでTrue
>>> isinstance(b, (int,str))
True

##使い分け
使い分けのポイントはやはりサブクラスの判定ですね。サブクラスをTrueにしたいならisinstance(),そうでないならtype()といったところでしょうか。

ちなみにPythonの公式リファレンスでは型の判定にはisinstance()の使用を推奨すると書かれれているようです。
https://docs.python.org/ja/3/library/functions.html#type

5
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?