型についてのあれこれ(1) - 導入偏
【 目次 】
pythonの型について調べてみた。
いつものように公式ドキュメントを調べてみてもごちゃごちゃしていて良く分からない。
情報がいろいろなところに分散しているように思う。
はっきりとした明確な記述が見当たらない。
単に、私に理解力が無いだけなのか?
仕方が無いので、いつものようにgoogleをあさって情報を集めてみた。
データモデル
Python における オブジェクト (object) とは、データを抽象的に表したものです。Python プログラムにおけるデータは全て、オブジェクトまたはオブジェクト間の関係として表されます。(ある意味では、プログラムコードもまたオブジェクトとして表されます。
...
値を変えることができるオブジェクトは 変更可能 (mutable) であるといいます; 値を一度設定すると、その後は変えることができないオブジェクトは 変更不能 (immutable) であると呼びます。
pythonのすべての値はオブジェクトであるらしい。
従って、javaのようにプリミティブ型(基本データ型)と参照型(c#で言えば値型と参照型)のような区別は無い。
すべてがjavaやC#で言う参照型という事になる。
データ型を調べる組み込み関数
型の情報をを調べるために有効と思われる組み込み関数を以下に示す。
- type(object)
object の型を返します。
- isinstance(object, classinfo)
引数 object が引数 classinfo のインスタンスであるか、 (直接または間接的な) サブクラスのインスタンスの場合に真を返します。また、 classinfo が型オブジェクト (新しい形式のクラス) であり、 object がその型のオブジェクトであるか、または、 (直接的または間接的な) サブクラスの場合にも真を返します。
- issubclass(class, classinfo)
class が classinfo の (直接または間接的な) サブクラスである場合に真を返します。クラスはそれ自身のサブクラスとみなされます。
pythonの型名はtypesモジュールに定義されている。
以下に例を示す。
#coding: UTF-8 # 変数iに5を代入 i=5 # 5はint型 print type(i) # typesモジュールに定義されているint型の型名を表示 import types print types.IntType # iはint型のインスタンス print isinstance(i,int) # numbersモジュールに定義されているint型のスーパクラスを参照 import numbers # int型はnumbers.Numberクラスのサブクラスであるので以下の結果はTrue print issubclass(int, numbers.Number) # iはnumbers.Numberクラスのサブクラスのインスタンスでもあるので以下の結果もTrue print isinstance(i,numbers.Number)
実行結果
<type 'int'> <type 'int'> True True True
次項(型についてのあれこれ(2) - 数値型と型のクラス階層)で述べるようにpythonの型は階層構造で定義されている。
そして、int型はnumbersモジュールに定義されているnumbers.Numberクラスのサブクラスになっている。