変数(オブジェクト)の型として以前、isinstanceという関数をご紹介しましたが、オブジェクトやクラスについて学習しましたので、type関数とisinstance関数を比較して学習しましょう。
Contents
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の方はサブクラスから生成したオブジェクトは親クラスから生成したオブジェクトとはみなされていません。このため、判定時に継承を考慮するかどうかを確認して適切に使い分けましょう。