isinstance() / issubclass() / type()
| 対応: | Python 2(2000) |
|---|
『isinstance()』はオブジェクトが指定した型(またはそのサブクラス)のインスタンスかどうかを判定します。『issubclass()』はクラスが別のクラスのサブクラスかどうかを判定し、『type()』はオブジェクトの型を返します。型チェックにはisinstance()を優先して使うべきで、type()による厳密な型比較はサブクラスを考慮しないため推奨されません。
構文
# 型の判定(サブクラスも含む) isinstance(object, classinfo) # クラスの継承関係を確認 issubclass(class, classinfo) # 型を取得(または動的にクラスを生成) type(object) type(name, bases, dict)
関数一覧
| 関数 | 概要 |
|---|---|
| isinstance(obj, type) | objがtypeのインスタンスであればTrueを返す。サブクラスも含む。 |
| isinstance(obj, (t1, t2)) | 複数の型のいずれかに該当する場合にTrueを返す。 |
| issubclass(cls, parent) | clsがparentのサブクラスであればTrueを返す(同じクラスも含む)。 |
| type(obj) | objの型(クラスオブジェクト)を返す。 |
| type(name, bases, dict) | 動的に新しいクラスを生成して返す。 |
サンプルコード
sample_isinstance_type.py
# isinstance: 基本的な型チェック
print(isinstance(42, int)) # True
print(isinstance(3.14, float)) # True
print(isinstance('hello', str)) # True
print(isinstance([1, 2], list)) # True
# isinstance: 複数の型をタプルで指定
def add(a, b):
if not isinstance(a, (int, float)):
raise TypeError(f"数値が必要ですが {type(a).__name__} が渡されました")
return a + b
print(add(1, 2)) # 3
print(add(1.5, 2.5)) # 4.0
# isinstance: サブクラスも含む(type()との違い)
class Animal:
pass
class Dog(Animal):
pass
d = Dog()
print(isinstance(d, Dog)) # True
print(isinstance(d, Animal)) # True(Animalのサブクラスなので)
print(type(d) == Animal) # False(厳密な型比較はサブクラスを含まない)
print(type(d) == Dog) # True
# issubclass: クラスの継承関係を確認
print(issubclass(Dog, Animal)) # True
print(issubclass(Animal, Dog)) # False
print(issubclass(Dog, Dog)) # True(自分自身はサブクラスに含まれる)
print(issubclass(bool, int)) # True(boolはintのサブクラス)
# type: 型の取得
print(type(42)) # <class 'int'>
print(type('hello')) # <class 'str'>
print(type(42).__name__) # 'int'
# type: 動的なクラス生成(高度な使い方)
MyClass = type('MyClass', (object,), {'x': 10, 'greet': lambda self: 'こんにちは'})
obj = MyClass()
print(obj.x) # 10
print(obj.greet()) # こんにちは
python3 isinstance_type.py True True True True 3 4.0 True True False True True False True True <class 'int'> <class 'str'> int 10 こんにちは
概要
『isinstance()』は継承関係を考慮するため、ポリモーフィズムを活用したコードに適しています。例えば『bool』はintのサブクラスなので、isinstance(True, int)はTrueを返します。
Python 3.10以降ではユニオン型(int | str)を使った記法もサポートされています。型ヒントと組み合わせることで、より型安全なコードを書けます。
『type()』に3つの引数を渡すとクラスを動的に生成できます。これはメタプログラミングで使われる高度な技法ですが、通常のコードでは可読性のためにclassキーワードを使ってクラスを定義する方が推奨されます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。