言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Python辞典

  1. トップページ
  2. Python辞典
  3. isinstance() / issubclass() / type()

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キーワードを使ってクラスを定義する方が推奨されます

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。