Python でデータ型を確認する方法 (型とインスタンス)

Python でデータ型を確認する方法を学びます。 type() と isinstance() をいつ使用するか、カスタム クラスを処理するか、書き込み安全な型チェック検証を行うかを理解します。

エディターでこのソリューションを試してください

概要

Python は動的に型指定される言語です。つまり、変数はあらゆるデータ型の値を保持でき、その型は実行中に変更できます。この柔軟性により初期開発が高速化されますが、整数の算術演算や文字列メソッドの呼び出しなど、型固有の操作を実行する前に、実行時に変数の型を検証する必要もあります。

オブジェクトのデータ型をチェックするために、Python には `type()` と `isinstance()` という 2 つの主要な関数が用意されています。 `type(obj)` 関数は、オブジェクトの正確なクラス タイプを返します。 `type(obj) == int` を使用して数値が整数であるかどうかを確認できますが、このメソッドは継承構造をサポートしていないため、一般的には推奨されません (整数のサブクラスは `False` と評価されます)。

型をチェックするための推奨される Python 的な方法は `isinstance(obj, class_info)` です。この関数は、オブジェクトが指定されたクラスのインスタンスであるか、またはそこから継承されたサブクラスであるかどうかを確認します。また、クラスのタプル (例: `isinstance(value, (int, float))`) に対するチェックもサポートしており、検証コードを非常に柔軟で堅牢なものにします。

コードと実行の出力

このスクリプトは、type() と isinstance() の両方を使用して変数の型をチェックする方法を示し、継承の違いを示します。

value_int = 42
value_str = "hello"

# 1. Checking type using isinstance() (Recommended)
is_number = isinstance(value_int, int)
print(f"Is {value_int} an int? {is_number}")

# Checking against multiple possible types
is_num_or_str = isinstance(value_str, (int, float, str))
print(f"Is '{value_str}' int, float, or str? {is_num_or_str}")

# 2. Checking type using type() (For exact class matches)
print(f"Exact type of value_int: {type(value_int).__name__}")
print("Is value_int exactly an int?", type(value_int) is int)

# 3. Inheritance difference
class CustomList(list):
    pass

my_list = CustomList([1, 2, 3])

print("\nInheritance testing:")
print("isinstance(my_list, list):", isinstance(my_list, list))
print("type(my_list) is list:", type(my_list) is list)
端子出力
Is 42 an int? True
Is 'hello' int, float, or str? True
Exact type of value_int: int
Is value_int exactly an int? True

Inheritance testing:
isinstance(my_list, list): True
type(my_list) is list: False

段階的な実装

  • 一般的な型チェックには isinstance(variable, type_name) を使用します (継承に準拠)。
  • isinstance(variable, (int, float)) のような型のタプルを渡して、複数のクラスに対してチェックします。
  • type(variable) is type_name は、サブクラスを無視して、クラスの正確な一致を保証する必要がある場合にのみ使用します。

よくある質問

isinstance() が type() よりも好まれるのはなぜですか?

isinstance() はオブジェクトの継承とポリモーフィズムをサポートします。組み込み型をサブクラス化すると、 isinstance() はそれを親クラスのインスタンスとして正しく認識しますが、 type() は False と評価します。

オブジェクトが(関数のように)呼び出し可能かどうかを確認するにはどうすればよいですか?

組み込みの callable() 関数を使用します。この関数は、オブジェクトを関数のように呼び出すことができる場合に True を返します。

関連トピック

推奨される Python リソース

関連するインタラクティブなチュートリアル、チートシート、コード比較で知識を深めてください。