Pythonでは、オブジェクトの型を確認するためにisinstance()
とtype()
という二つの関数があります。これらの関数は似ていますが、使い方や挙動には重要な違いがあります。
isinstance関数の基本構文
isinstance()
関数の基本構文は以下の通りです。
isinstance(object, classinfo)
ここで、object
は型を調べたいオブジェクトを指定し、classinfo
はクラスやデータ型を指定します。object
がclassinfo
に指定されたクラスやデータ型に属していればTrue
を返し、属していなければFalse
を返します。
例えば、以下のようなコードがあります。
def process_data(data):
if isinstance(data, list):
total = sum(data)
return total
else:
return "Invalid input data"
data1 = [10, 20, 30, 40, 50]
data2 = "This is not a list"
result1 = process_data(data1)
result2 = process_data(data2)
print(result1) # 150
print(result2) # Invalid input data
このコードでは、isinstance()
関数を使ってdata
がリスト型かどうかを確認しています。もしdata
がリスト型であれば、その合計値を返し、そうでなければ"Invalid input data"
を返します。
isinstanceとtypeの違い
isinstance()
は継承関係を考慮して型をチェックするのに対し、type()
はオブジェクトの型そのものを返す関数です。したがって、サブクラスまで考慮したい場合はisinstance()
を使うのが良いです。
以下のコードを見てみましょう。
class Fruit:
pass
class Apple(Fruit):
pass
obj_fruit = Fruit()
obj_apple = Apple()
print(isinstance(obj_fruit, Apple)) # False
print(type(obj_fruit) == Apple) # False
print(isinstance(obj_apple, Fruit)) # True
print(type(obj_apple) == Fruit) # False
このコードでは、Fruit
クラスとそのサブクラスであるApple
クラスを定義し、それぞれのインスタンスを作成しています。そして、isinstance()
とtype()
を使って型の確認を行っています。
obj_fruit
の場合、isinstance(obj_fruit, Apple)
とtype(obj_fruit) == Apple
の両方ともFalse
を返します。これは、obj_fruit
の型が厳密にはFruit
クラスであり、Apple
クラスではないためです。
一方、obj_apple
の場合、isinstance(obj_apple, Fruit)
はTrue
を返しますが、type(obj_apple) == Fruit
はFalse
を返します。これは、obj_apple
の型が厳密にはApple
クラスであり、Fruit
クラスではないと判断されていることがわかります。
以上のように、isinstance()
とtype()
は似ていますが、使い方や挙動には重要な違いがあります。これらの違いを理解することで、Pythonの型システムをより深く理解することができます。