Python isinstanceの使い方

この記事のポイント

Pythonのisinstance関数は、オブジェクトの型を正確に判定するための関数です。

この記事を読むと、次のようなことが身に付きます。

  • 安全なオブジェクトの型判定方法がわかる
  • 継承関係も考慮した柔軟な型チェックが理解できる
  • エラー処理と組み合わせた実践的なプログラム作成例を知る

この記事を通してisinstance関数の正しい使い方をマスターすれば、エラーを防いで保守性の高いプログラムが書けるようになります。

目次

isinstanceとは?

isinstance関数は、あるオブジェクト(データ)が特定の型(クラス)かどうかを判定するための組み込み関数です。

isinstance関数の最も重要な特徴は、単純な型チェックだけでなく、クラスの継承関係(親子関係)も考慮して判定する点にあります。

type関数という似た関数がありますが、type関数は「型が完全に一致しているか」だけを調べます。一方、isinstance関数は、調べたいオブジェクトが指定したクラスを継承(性質を引き継ぐこと)して作られた子クラスのインスタンスであってもTrueを返します。

isinstance関数の特徴

isinstance関数の主な特徴は以下の通りです。

  • オブジェクトが特定の型(クラス)かどうかを判定する
  • 継承関係を考慮して判定できる(親クラスでもTrueを返す)
  • type関数よりも柔軟な型チェックができる

この関数は、プログラム実行中に予期しない型(例えば数値が欲しいところに文字列)が入ってきてエラーになるのを防ぐため、事前にデータチェックをしたい場面で活躍します。

【関連】
Pythonをもっと詳しく学ぶならpaizaラーニング

基本構文

isinstance関数の基本的な構文は、isinstance(オブジェクト, クラス名)という形で記述します。

  • 第1引数:判定したいオブジェクト
  • 第2引数:確認したいクラス(型)

戻り値はbool値(True または False)です。オブジェクトが指定したクラス(型)のインスタンスであればTrue、そうでなければFalseが返されます。

まずは、基本的な使い方を見てみましょう。変数textがstr型か、変数numberがint型かを判定します。

# 文字列の判定 text = "ネコ" print(isinstance(text, str)) # 数値の判定 number = "42" # 文字列として代入 print(isinstance(number, int))

出力結果

True
False

この例では、textはstr型なので、isinstance(text, str) はTrueと出力されます。一方、number変数には"42"という文字列が代入されています(ダブルクォーテーション「 " 」で囲まれている点に注意してください)。isinstance(number, int) は、「numberがint型か?」を判定します。numberの中身はstr型でありint型ではないため、Falseと出力されます。

次の例では、isinstance関数の第2引数に複数の型をタプル(( )で囲んだもの)で指定しています。タプルに含まれる型のどれか一つにでも当てはまればTrueが返されます。

# 複数の型を同時チェック value = 3.14 print(isinstance(value, (int, float))) # リストの判定 animals = ["イヌ", "ネコ", "ウサギ"] print(isinstance(animals, list))

出力結果

True
True

この例では、valueの中身は3.14でfloat型、第2引数に(int, float)と指定しているため、intまたはfloatのどちらかであればTrueとなります。animalsは[ ]で囲まれたlist型なので、Trueと出力されます。

実用例

isinstance関数の本当の価値は、実際のプログラミング現場での活用にあります。データ処理、エラーハンドリング(エラー処理)、関数の引数チェックなど、さまざまな場面で型の安全性を確保するために使用されます。

型判定を適切に行うと、バグの少ないプログラムを作成できます。ここでは実用的なコード例を見ながら、isinstance関数の使い方を学んでいきましょう。

基本的な型判定

オブジェクトが基本的なデータ型(文字列、数値、真偽値など)に属しているかを確認する、最も基本的な使い方です。

def check_animal_type(animal): if isinstance(animal, str): return f"{animal}は文字列です" elif isinstance(animal, int): return f"{animal}匹の動物がいます" else: return "不明な型です" print(check_animal_type("ライオン")) print(check_animal_type(5))

出力結果

ライオンは文字列です
5匹の動物がいます

この例では、渡された引数の型に応じて異なる文字列が返されています。check_animal_type関数は、isinstanceを使い、引数animalの型を判定します。"ライオン"を渡すとisinstance(animal, str)がTrueとなり、「ライオンは文字列です」が返されます。

5を渡すと、if文はFalseとなり、次のelif isinstance(animal, int)がTrueとなるため、「5匹の動物がいます」が返されます。

リストと文字列の判定

コレクション型と文字列を区別して処理する際によく使われるパターンです。データの構造に応じて適切な処理を分岐させます。

def process_animals(data): if isinstance(data, list): return f"動物リスト: {', '.join(data)}" elif isinstance(data, str): return f"単体の動物: {data}" animals = ["パンダ", "コアラ", "キリン"] single_animal = "ゾウ" print(process_animals(animals)) print(process_animals(single_animal))

出力結果

動物リスト: パンダ, コアラ, キリン
単体の動物: ゾウ

この例では、引数がリストか文字列かで処理が分岐し、異なる形式で出力されています。process_animals関数は、引数dataの型をisinstanceで判定します。

リストanimalsを渡すとisinstance(data, list)がTrueとなり、joinメソッドで要素が連結されます。一方、文字列single_animalを渡すと、elif isinstance(data, str)がTrueとなり、文字列がそのままの形式で返されています。

複数の型を同時にチェック

基本構文でも触れたように、タプルを使うことで複数の型を一度に判定できます。数値型(整数や浮動小数点数など)の判定でよく使用されます。

def calculate_animal_count(value): if isinstance(value, (int, float)): return f"動物の数: {value}匹" else: return "数値ではありません" print(calculate_animal_count(10)) print(calculate_animal_count(3.5)) print(calculate_animal_count("ウマ"))

出力結果

動物の数: 10匹
動物の数: 3.5匹
数値ではありません

この例では、数値(整数・浮動小数点数)かそれ以外かで処理が分岐しています。calculate_animal_count関数は、isinstance(value, (int, float))を使って、引数valueがint型かfloat型のどちらかに当てはまるかを判定します。

10(int)と3.5(float)はタプル内の型に当てはまるためTrueとなり、匹数が表示されます。"ウマ"(str)はどちらにも当てはまらないためFalseとなり、else文のエラーメッセージが返されます。

継承クラスの型判定

クラスの継承関係を考慮した型判定を行います。isinstance関数の最も重要な特徴である継承の認識を活用します。

class Animal: pass class Dog(Animal): def bark(self): return "ワンワン" my_dog = Dog() print(isinstance(my_dog, Dog)) print(isinstance(my_dog, Animal))

出力結果

True
True

この例では、Dogクラスのインスタンスが、自身のDog型、および親クラスのAnimal型の両方として認識され、Trueが2回出力されています。DogクラスはAnimalクラスを継承して定義されています。

isinstance関数は継承関係を考慮するため、my_dogインスタンスはDog型であると同時に、親クラスであるAnimal型でもあると判定します。type関数ではAnimal型とは判定されない、isinstance特有の動作です。

エラーハンドリングとの組み合わせ

型チェックを事前に行い、予期しない型のデータが来た場合にエラーを発生させる、という使い方です。エラーを未然に防ぐ防御的プログラミングの実践例です。

def safe_animal_length(animal_name): if isinstance(animal_name, str): return len(animal_name) else: raise TypeError("動物名は文字列で入力してください") try: print(safe_animal_length("シマウマ")) print(safe_animal_length(123)) except TypeError as e: print(f"エラー: {e}")

出力結果

4
エラー: 動物名は文字列で入力してください

この例では、safe_animal_length関数に渡された文字列の場合は文字数が出力され、数値の場合はTypeErrorを補足してエラーメッセージが出力されています。

safe_animal_length関数は、isinstance関数でstr型かを確認します。str型でない場合、raise TypeErrorで意図的にエラーを発生させます。tryブロック内でsafe_animal_length(123)が呼び出されると、TypeErrorが発生し、exceptブロックが実行されます。

関数の引数チェック

関数の引数が期待される型かどうかを確認し、適切な処理を実行する実用的なパターンです。isinstance関数の前にnotを付けることで、「もし、その型でないならば」という条件分岐が可能になります。

def feed_animal(animal, food_amount): if not isinstance(animal, str): return "動物名は文字列で指定してください" if not isinstance(food_amount, (int, float)): return "餌の量は数値で指定してください" return f"{animal}に{food_amount}グラムの餌をあげました" print(feed_animal("カンガルー", 500)) print(feed_animal(123, 300))

出力結果

カンガルーに500グラムの餌をあげました
動物名は文字列で指定してください

この例では、1回目の呼び出しは成功し、2回目は引数の型が異なるためエラーメッセージが返されています。

feed_animal関数は、not isinstance関数を使い、animalがstr型でない場合、またはfood_amountがintかfloatでない場合に、エラーメッセージを返して処理を中断します。feed_animal(123, 300)の呼び出しでは、最初のif文(animalの型チェック)がTrueとなり、エラーメッセージが返されます。

データ処理での型判定

文字列や数値など、異なるデータ型が混在するリストを処理する際の活用例です。データの仕分け(データクリーニング)でよく使用されます。

def process_mixed_data(data_list): animals = [] counts = [] for item in data_list: if isinstance(item, str): animals.append(item) elif isinstance(item, (int, float)): counts.append(item) return animals, counts mixed_list = ["トラ", 3, "ヒツジ", 7.5, "ブタ"] animal_names, animal_counts = process_mixed_data(mixed_list) print(f"動物: {animal_names}") print(f"数値: {animal_counts}")

出力結果

動物: ['トラ', 'ヒツジ', 'ブタ']
数値: [3, 7.5]

この例では、文字列と数値が混在したリストが、2つの別々のリスト(動物名リストと数値リスト)に仕分けされて出力されています。

process_mixed_data関数は、forループでリストの全要素を調べます。isinstance(item, str)がTrueならanimalsリストに、isinstance(item, (int, float))がTrueならcountsリストに要素を追加(append)します。最終的に、仕分け後の2つのリストを返しています。

クラスのインスタンス判定

カスタムクラスのインスタンスかどうかを判定し、適切なメソッドを呼び出す高度な活用例です。

class Cat: def __init__(self, name): self.name = name def meow(self): return f"{self.name}: ニャー" def handle_animal(animal): if isinstance(animal, Cat): return animal.meow() elif isinstance(animal, str): return f"文字列の動物: {animal}" my_cat = Cat("ミケ") print(handle_animal(my_cat)) print(handle_animal("野良ネコ"))

出力結果

ミケ: ニャー
文字列の動物: 野良ネコ

この例では、Catクラスのインスタンスを渡すと「ミケ: ニャー」、文字列を渡すと「文字列の動物: 野良ネコ」が出力されています。

handle_animal関数は、isinstance(animal, Cat)で引数がCatのインスタンスか判定します。Trueの場合、Catインスタンスが持つ.meow()メソッドを呼び出します。Catインスタンスでない場合、elifでstr型かを判定し、Trueであれば別の文字列を返します。

まとめ

isinstance関数は、Pythonプログラミングで安全で堅牢なコードを書くための重要なツールです。単純な型チェックから継承関係を考慮した判定まで、幅広い用途に対応できます。適切に活用すると、予期しないエラーを防ぎ、保守性の高いプログラムを作成できます。

isinstanceの活躍する場面

  • 関数の引数検証でデータの整合性を保つ場面
  • 混在データの分類処理を行う場面
  • エラー防止のための事前型チェックが必要な場面

重要なポイント

  • 継承関係も認識する柔軟な型判定機能
  • タプル指定による複数型の同時チェック機能
  • type関数より安全なオブジェクト指向対応

isinstance関数をマスターすることで、より信頼性が高く、エラーに強いPythonプログラムを開発できるようになります。実際のプロジェクトでは、データの型を事前に確認する習慣を身につけることが、品質の高いソフトウェア開発につながります。

レベルを更に上げたい方はpaizaプログラミングスキルチェックへ

  1. paizaラーニングトップ
  2. リファレンス
  3. Pythonのリファレンス記事一覧
  4. Python isinstanceの使い方