type
このページでは豊富な例を用いてPythonのtype関数の使い方を学ぶことができます。
type関数は引数で与えたオブジェクトの型を取得し、対象の型情報を確認することができます。
実態としてはtypeクラスのコンストラクタ(__init__メソッド)を呼び出しており、
戻り値(返り値)としてtypeオブジェクト(型オブジェクト、原文:type object)を返します。
型の判定についてはtype関数を用いることもできますが、 サブクラス(derived class, 派生クラス)の考慮といった観点から 組み込み関数のisinstance を使うことが推奨されています。(バージョン3.9.0時点)
TL;DR
基本
# typeは引数で与えたオブジェクトの型(型オブジェクト、原文:type object)を返す
string1 = 'ABC'
type1 = type(string1)
# strオブジェクト(文字列)の型
print(type1)
==> <class 'str'>
# 型オブジェクトの型
print(type(type1))
==> <class 'type'>
# int
print(type(1))
==> <class 'int'>
# コンストラクタを呼び出す
print(type(int()))
==> <class 'int'>
# float
print(type(3.14))
==> <class 'float'>
# complex
print(type(1 + 2j))
==> <class 'complex'>
# bool
print(type(True))
==> <class 'bool'>
# list
list1 = [1, 2, 3, 4]
print(type(list1))
==> <class 'list'>
# dict
print(type({}))
==> <class 'dict'>
# 独自クラス
class Person:
def __init__(self, identifier, name):
self.identifier = identifier
self.name = name
print(type(Person(1, 'Ashley')))
==> <class '__main__.(実行環境により異なります).Person'>
関連情報:class(クラス定義)の使用方法
型の判定
# isを使用した判定
is_string1 = type('python') is str
print(is_string1)
==> True
# ==を使用した判定
is_string2 = type('python') == str
print(is_string2)
==> True
# 同じ型かどうかの判定
list1 = [1, 2]
list2 = ['python', 'js']
string1 = 'python'
is_same_type = type(list1) is type(list2)
print(is_same_type)
==> True
is_same_type = type(list2) is type(string1)
print(is_same_type)
==> False
# どれか1つの型に当てはまるかどうかの判定
if type((0, 1)) in (tuple, list):
print('tuple or list')
else:
print('not match')
==> tuple or list
if type(False) in [str, int]:
print('str or int')
else:
print('not match')
==> not match
関連情報:ifの使用方法
isinstanceとの違い
# isinstanceを用いた型判定
string1 = 'January'
# 第1引数のオブジェクトが第2引数の型と一致していたらTrue
print(isinstance(string1, str))
==> True
# 一致しない場合
print(isinstance(string1, tuple))
==> False
# typeとisinstanceの比較
list1 = [0, 1, 2]
# type
print(type(list1) is list)
==> True
# isinstance
print(isinstance(list1, list))
==> True
# WebEngineerからみた基底クラス(base class, スーパークラス)
class Engineer:
def __init__(self, identifier, name):
self.identifier = identifier
self.name = name
# Engineerからみた派生クラス(derived class, サブクラス)
class WebEngineer(Engineer):
pass
# typeとisinstanceの挙動の違い
web_engineer1 = WebEngineer(1, 'Jake')
# サブクラス
print(type(web_engineer1) == WebEngineer)
==> True
print(isinstance(web_engineer1, WebEngineer))
==> True
# スーパークラス(継承関係が考慮される)
print(type(web_engineer1) == Engineer)
==> False
print(isinstance(web_engineer1, Engineer))
==> True
関連情報:class(クラス定義)の使用方法
関連情報:isinstanceの使用方法
解説
基本
typeは引数で与えたオブジェクトの型情報(typeクラスのオブジェクト)を取得することができます。
型情報を手軽に確認することができ、後述する型の判定にも用いることが可能です。
# str
print(type('Python'))
==> <class 'str'>
# tuple
print(type(()))
==> <class 'tuple'>
# typeオブジェクトの型判定
type1 = type(False)
print(type(type1))
==> <class 'type'>
型の判定
is
や==
などを使用することで型の判定を行うことができます。
しかし、typeを使用した型の判定はサブクラス(derived class, 派生クラス)を考慮することができません。
そのため、型判定の際には
組み込み関数のisinstance
を使用することが推奨されます。(バージョン3.9.0時点)
このページでも次項で簡潔に解説しますが、詳しい情報は上記のリンクを参照してください。
# isを使用した判定
is_int1 = type(1) is int
print(is_int1)
==> True
# ==を使用した判定
is_int2 = type(0) == int
print(is_int2)
==> True
isinstanceとの違い
Pythonでの型判定には、typeとisinstance
を用いる方法が例として多くあがります。
比較する型と完全に同一の型判定を行う際にはどちらも使用することが可能です。
しかし、typeを使用する型判定は継承関係を考慮できません。
継承関係を考慮した判定を行いたい場合は
組み込み関数のisinstance
を使用してください。
tuple1 = (0, 1)
# 一致する場合
print(isinstance(tuple1, tuple))
==> True
# 一致しない場合
print(isinstance(tuple1, str))
==> False
# WebEngineerからみた基底クラス(base class, スーパークラス)
class Engineer:
def __init__(self, identifier, name):
self.identifier = identifier
self.name = name
# Engineerからみた派生クラス(derived class, サブクラス)
class WebEngineer(Engineer):
pass
# typeとisinstanceの挙動の違い
web_engineer1 = WebEngineer(1, 'Jake')
# サブクラス
print(type(web_engineer1) == WebEngineer)
==> True
print(isinstance(web_engineer1, WebEngineer))
==> True
# スーパークラス(継承関係が考慮される)
print(type(web_engineer1) == Engineer)
==> False
print(isinstance(web_engineer1, Engineer))
==> True
関連情報:class(クラス定義)の使用方法