何らかのオブジェクトの型を知りたいときには、type関数とisinstance関数が使える。それらの使い方の基本を紹介する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
# type関数
a = 1
t = type(a)
print(t) # <class 'int'>
tt = type(t) # type関数の戻り値の型
print(tt) # <class 'type'>
tt = type(int) # int型(intクラス)の型
print(tt) # <class 'type'>
# オブジェクトの型で振る舞いを変えるには
if type(a) == int:
print(f'{a}の型はintです')
elif type(a) == float:
print(f'{a}の型はfloatです')
n = 1.2
t = type(n)
if t == int or t == float or t == complex:
print(f'{n} is number: {t}') # 1.2 is number: <class 'float'>
if t in (int, float, complex):
print(f'{n} is number: {t}') # 1.2 is number: <class 'float'>
# isinstance関数
result = isinstance(1, int)
print(result) # True
result = isinstance(1.2, (int, float, complex))
print(result) # True
class A:
pass
class B(A):
pass
b = B()
result = isinstance(b, A)
print(result) # True
class C:
pass
c = C()
result = isinstance(c, A)
print(result) # False
n = 1.2
if isinstance(n, (int, float, complex)):
print(f'{n} is number: {type(n)}') # 1.2 is number: <class 'float'>
if isinstance(n, int | float | complex):
print(f'{n} is number: {type(n)}') # 1.2 is number: <class 'float'>
import numbers
result = isinstance(1, numbers.Number)
print(result)
result = isinstance(1.2, numbers.Number)
print(result)
result = isinstance(1.2 + 1.0j, numbers.Number)
print(result)
if isinstance(n, numbers.Number):
print(f'{n} is number: {type(n)}') # 1.2 is number: <class 'float'>
Pythonであるオブジェクトの型を知るには以下の2つの方法がある。
なお、「type関数のドキュメント」には「オブジェクトの型の判定には、 isinstance() 組み込み関数を使うことが推奨されます。これはサブクラスを考慮するからです」とあることには留意しよう(とはいうものの、ちょっと知りたいというときには筆者もtype関数をよく使っている)。
type関数に何かのオブジェクトを渡すと、そのオブジェクトの型が返される。以下に例を示す。
a = 1
t = type(a)
print(t) # <class 'int'>
この例では整数値の1を渡しているので、その型として「<class 'int'>」が返されている。この戻り値はtype型のオブジェクトになっている。また、通常のintクラスオブジェクトもまたtype型のオブジェクトである。
tt = type(t) # type関数の戻り値の型
print(tt) # <class 'type'>
tt = type(int) # int型(intクラス)の型
print(tt) # <class 'type'>
つまり、type関数の戻り値とintやfloat、その他の組み込み型やユーザー定義のクラスなどはtype型のオブジェクトであり、これらを比較できる。このことを使って、あるオブジェクトが特定の型であった場合に、何らかの処理を実行するといったことが可能だ。
if type(a) == int:
print(f'{a}の型はintです')
elif type(a) == float:
print(f'{a}の型はfloatです')
あるオブジェクトが特定の幾つかの型のいずれかであるかどうかを知りたいのであれば、or演算子を使って次のように書ける。
n = 1.2
t = type(n)
if t == int or t == float or t == complex:
print(f'{n} is number: {t}') # 1.2 is number: <class 'float'>
これは煩雑なので、in演算子を使って次のようにも書ける。
if t in (int, float, complex):
print(f'{n} is number: {t}') # 1.2 is number: <class 'float'>
この書き方も必要な情報は全てプログラマーの側が列挙しなければならないという点では上の例とそれほど変わらない。
これに対して、isinstance関数はクラス階層を考慮してくれるという点で便利だ。
Copyright© Digital Advantage Corp. All Rights Reserved.