typeとisinstanceの違い
Python
組み込みのtype()
とisinstance()
はオブジェクトの型(クラス)を判定するために使用される関数ですが、微妙な違いがあります。
結論
次のユースケースでは基本的にisinstance()
を使う。
- クラスの継承元のインスタンスか判定
- 複数の型で確認
厳密にオブジェクトの型を調べる時はtype()
を使う。
理由
理由としては次のようなことが挙げられる。
-
type()
は厳密に何のインスタンスか返すため、継承元のクラスのインスタンスであることを判定できない -
type()
では複数の型を同時に調べることができない
具体例
継承元のインスタンスかどうか判定したいとき
-
Car
クラスを継承したMyCar
というクラスがある -
mycar
をMyCar
でインスタンス化する - 継承元の
Car
クラスのインスタンスかMyCar
のインスタンスか調べる
class Car():
pass
class MyCar(Car):
pass
mycar = MyCar()
print(type(mycar) is Car) # False
print(type(mycar) is MyCar) # True
print(isinstance(mycar, Car)) # True
print(isinstance(mycar, MyCar)) # True
変数number
がint
かfloat
の時に条件分岐で処理を進めたいとき
# typeを使った例
number = 42
if (type(number) is int) or (type(number) is float):
print(f"number: {type(number)}") # number: <class 'int'>
# isinstanceを使った例
number = 42.0
if isinstance(number, (int, float)):
print(f"number: {type(number)}") # number: <class 'float'>
要点
厳密さを求めるなら全てにおいてtype()
を使って判定した方が良いが、冗長になる可能性が高い。違いをきちんと理解して使い分けれるようになりたいところ。