変数の型を判定する その2 type関数

変数(オブジェクト)の型として以前、isinstanceという関数をご紹介しましたが、オブジェクトやクラスについて学習しましたので、type関数とisinstance関数を比較して学習しましょう。

type関数

type関数は引数で指定したオブジェクトのクラス(=型オブジェクト)を返します。

class Sample():
    pass

# オブジェクトを生成
s = Sample()

# sオブジェクトの型を取得する
s_type = type(s)
print(s_type) # <class '__main__.Sample'> 

この他にも、動的にクラスを生成することもできるのですが、応用的な内容であるため別途説明します。

type関数とisinstance関数

さて、このtype関数を使用してオブジェクトのクラスを判定することが可能なのですが、type関数は継承関係を考慮しない仕様となっています。以下のサンプルコードを見てください。

class Sample1():
    """ 適当なクラス """
    pass


class Sample2(Sample1):
    """ Sample1を親とするクラス """
    pass


obj1 = Sample1() # Sample1型のオブジェクトを生成する
obj2 = Sample2() # Sample2型のオブジェクトを生成する

# Typeを使用した場合、Sample2型はSample1型とはみなされない
print(type(obj1) == Sample1) # True
print(type(obj1) == Sample2) # False
print(type(obj2) == Sample1) # False
print(type(obj2) == Sample2) # True 

# isinstanceを使用した場合、Sample2型はSample1型とみなされる
print(isinstance(obj1, Sample1)) # True
print(isinstance(obj1, Sample2)) # False
print(isinstance(obj2, Sample1)) # True
print(isinstance(obj2, Sample2)) # True


isinstanceの方は、親子関係を考慮した結果が出力されていることが確認できます。一方、typeの方はサブクラスから生成したオブジェクトは親クラスから生成したオブジェクトとはみなされていません。このため、判定時に継承を考慮するかどうかを確認して適切に使い分けましょう。