型を調べたいときに使える組み込み関数として、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