isinstance
このページでは豊富な例を用いてPythonのisinstance関数の使い方を学ぶことができます。
isinstanceはPythonの組み込み関数です。
第1引数に指定したオブジェクトが、第2引数で指定したインスタンスまたはそのサブクラスのインスタンスかどうかを判定し、
その結果をboolオブジェクトとして返します。
第2引数にはtupleを使用して複数の型を指定することもできます。
型の判定については type関数 を用いることもできますが、サブクラス(derived class, 派生クラス)の考慮といった観点から isinstanceを使うことが推奨されています。(バージョン3.9.0時点)
TL;DR
基本
# 第1引数のオブジェクトが第2引数で与えたクラス、またはそのサブクラスのインスタンスの場合True
print(isinstance('ABCDE', str))
==> True
print(isinstance(100, float))
==> False
# isinstanceはサブクラスのインスタンスもTrue判定
print(isinstance(False, bool))
==> True
# Pythonのboolはintのサブクラス
print(isinstance(False, int))
==> True
list1 = [0, 1, 2]
print(isinstance(list1, list))
==> True
# objectクラスはすべてのクラスにとってスーパークラスのためTrue
print(isinstance(list1, object))
==> True
# 独自クラスの場合
class Engineer:
pass
# Engineerクラスのサブクラス
class MachineLearningEngineer(Engineer):
pass
ml_engineer1 = MachineLearningEngineer()
engineer1 = Engineer()
# ml_engineer1はMachineLearningEngineerクラスのインスタンス
print(isinstance(ml_engineer1, MachineLearningEngineer))
==> True
# ml_engineer1はEngineerクラスのサブクラスのインスタンス
print(isinstance(ml_engineer1, Engineer))
==> True
# ml_engineer1はobjectクラスのサブクラスのインスタンス
print(isinstance(ml_engineer1, object))
==> True
# engineer1はMachineLearningEngineerクラスやそのサブクラスのインスタンスでもない
# engineer1はMachineLearningEngineerクラスのスーパークラスなのでFalse
print(isinstance(engineer1, MachineLearningEngineer))
==> False
関連情報:class(クラス定義)の使用方法
複数インスタンスのどれかに一致するか調べたい
# 第2引数に型オブジェクトを要素としたtupleを指定することで、複数のクラスのうち1つのインスタンスであればTrueになる
int1 = 100
tuple1 = (str, int)
print(isinstance(int1, tuple1))
==> True
# 上記は以下の記述と同じ
print(isinstance(int1, str) or isinstance(int1, int))
==> True
# 'python'という文字列(strオブジェクト)はtupleの要素のクラスのインスタンスではない
print(isinstance('python', (bool, int, list)))
==> False
type(typeクラス)との違い
# typeを用いた型判定
string1 = 'January'
# 第1引数のオブジェクトがstrクラスのオブジェクトだったらTrue
print(type(string1) is str)
==> True
# 一致しない場合
print(type(string1) is int)
==> False
# typeとisinstanceの記述方法の差異
tuple1 = ('py', 'js', 'rb')
# type
print(type(tuple1) is tuple)
==> True
# isinstance
print(isinstance(tuple1, tuple))
==> True
# WebEngineerからみた基底クラス(base class, スーパークラス)
class Engineer:
pass
# Engineerからみた派生クラス(derived class, サブクラス)
class WebEngineer(Engineer):
pass
# typeとisinstanceの挙動の違い
web_engineer1 = WebEngineer()
# サブクラス
print(type(web_engineer1) == WebEngineer)
==> True
print(isinstance(web_engineer1, WebEngineer))
==> True
# スーパークラス(継承関係が考慮される)
print(type(web_engineer1) == Engineer)
==> False
print(isinstance(web_engineer1, Engineer))
==> True
関連情報:type(組み込み関数)の使用方法
解説
基本
isinstanceは第1引数に指定したオブジェクトが第2引数で指定したクラスのインスタンス、 または、そのサブクラスのインスタンスである場合にTrueを返します。
string1 = 'Python'
print(isinstance(string1, str))
==> True
print(isinstance(string1, list))
==> False
# isinstanceはサブクラスも考慮する判定例
bool1 = True
print(isinstance(bool1, bool))
==> True
# Pythonのboolはintのサブクラス
print(isinstance(bool1, int))
==> True
複数インスタンスのどれかに一致するか調べたい
第2引数には型オブジェクトを要素としたtupleオブジェクトを取ることもできます。
この場合、第1引数のオブジェクトがtupleの要素のどれか1つを満たせば(サブクラス含む)判定結果はTrueとなります。
# 複数のクラスのインスタンスかどうかを判定したい場合がある
list1 = ['python', 'tuple', 'list']
if isinstance(list1, tuple) or isinstance(list1, list):
print('tuple or list')
else:
print('not match')
==> tuple or list
# 第2引数にtupleを使用して簡潔に
if isinstance(list1, (tuple, list)):
print('tuple or list')
else:
print('not match')
==> tuple or list
関連情報:ifの使用方法
type(typeクラス)との違い
Pythonでの型判定には、type
とisinstance
を用いる方法が例として多く確認できます。
比較する型と完全に同一の型判定を行う際にはどちらも使用することが可能です。
しかし、typeを使用する型判定は継承関係を考慮できません。
継承関係を考慮した判定を行いたい場合はこのページで解説しているisinstance
を使用してください。
関連情報:type(組み込み関数)の使用方法
list1 = [0, 1]
# 一致する場合
print(type(list1) == list)
==> True
# 一致しない場合
print(type(list1) == str)
==> False
# WebEngineerからみた基底クラス(base class, スーパークラス)
class Engineer:
pass
# Engineerからみた派生クラス(derived class, サブクラス)
class WebEngineer(Engineer):
pass
# typeとisinstanceの挙動の違い
web_engineer1 = WebEngineer()
# サブクラス
print(type(web_engineer1) == WebEngineer)
==> True
print(isinstance(web_engineer1, WebEngineer))
==> True
# スーパークラス(継承関係が考慮される)
print(type(web_engineer1) == Engineer)
==> False
print(isinstance(web_engineer1, Engineer))
==> True
関連情報:class(クラス定義)の使用方法