この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。
前回は、osモジュールをご紹介しました。色々なファイルやディレクトリ操作ができます。
今回はオブジェクトです。Pythonの中核を占める要素ですね。
オブジェクトとは
まず、オブジェクトとはいったい何なんでしょうか。すべてのデータはオブジェクトと書きました。それではデータ以外のオブジェクトはあるのでしょうか。
Pythonでは、オブジェクトとはプログラムの実行時にコンピューターのメモリ上に作成された物を指します。メモリ上にある何かは、すべてオブジェクトと言えます。メモリ上の配置位置情報(アドレス)はそのオブジェクトがメモリから削除されるまでは変わりません。
Pythonのオブジェクトには、以下の3つの要素を持っています。
- オブジェクトID id関数で確認できる
- データ型 type関数で確認できる
- 値
データ型、値という要素があるということは、Pythonではオブジェクトはすべてデータであるといえると思います。「Pythonでは操作対象がデータ自体」と書いたことがあるのですが、あながち間違いでもなさそうです。
整数1もオブジェクトですので、これらを確認できます。
print(id(1)) # オブジェクトID 140724237353768(環境により異なる)を返す print(type(1)) # データ型 <class 'int'>を返す print(1) # 値 1を返す
関数オブジェクト
関数もコンピューターのメモリ上に読み込まれますので、オブジェクトになります。
def func_test(): pass print(id(func_test)) # 2122440441376(環境により異なる)を返す print(type(func_test)) # <class 'function'>を返す print(func_test) # <function func_test at 0x000001EE2B4EFE20>を返す
値として表示されている「0x000001EE2B4EFE20」は、オブジェクトIDの16進表記です。
モジュールオブジェクト
モジュールもメモリ上に読み込まれますので、オブジェクトになります。こちらも見てみましょう。 フォルダーの中に、空のファイル「mod_1.py」を作成した後に、同じフォルダー内で以下を実行してみましょう。
import mod_1 print(id(mod_1)) # 2122440959024(環境により異なる)を返す print(type(mod_1)) # <class 'module'>を返す print(mod_1) # <module 'mod_1' from 'ファイルパス\\mod_1.py'>を返す
モジュールのデータ型は「module型」なんですね。値は、フルパスのファイル名になっています。
標準ライブラリのモジュールではどうでしょうか。
import os print(id(os)) # 2122345888272(環境により異なる)を返す print(type(os)) # <class 'module'>を返す print(os) # <module 'os' (frozen)>を返す
こちらのデータ型も「module型」です。値で取得される「(frozen)」は、ツールでバイナリ形式に変換された標準ライブラリのモジュールという意味です。
同一性判定演算子
Pythonのオブジェクトには、オブジェクトID、データ型、値を持つことは前述しました。同じ値を持つオブジェクトでも、異なるオブジェクトIDを持つことがあるということです。以下のスクリプトを見てみましょう。
x = '123' y = x z = str(123) print(x == y) # Trueを返す print(x == z) # Trueを返す print(id(x)) # 2332196683376(環境により異なる)を返す print(id(y)) # 2332196683376(変数Xと同じID)を返す print(id(z)) # 2332232771312(変数Xと異なるID)を返す
変数xとyにはオブジェクト「'123'」が割り当てられました。変数Zにはstr関数で生成されたオブジェクトが割り当てられています。3つの変数は同じ値(と同じデータ型)を持ちますが、変数ZだけはオブジェクトIDが異なります。
2つのオブジェクトが同じオブジェクトIDを持っているかどうかは、id関数の結果を比較すればわかるのですが、同一性判定演算子を使えば直接比較できます。記述方法は以下になります。
オブジェクト_1 is オブジェクト_2: オブジェクトが同一か オブジェクト_1 is not オブジェクト_2: オブジェクトが同一でないか
先のスクリプトの結果を確認すると、以下のようになります。
print(x is y) # Trueを返す print(x is z) # Falseを返す print(x is not z) # Trueを返す
オブジェクトの値が等しくても、オブジェクトIDが異なる(違うオブジェクトである)事があることを認識しましょう。
メソッド
今までもたびたびご紹介しましたが、オブジェクトの中には「メソッド」と呼ばれる機能を持つものがあります。メソッドはデータ型に紐付いた関数です。メソッドの呼び出し方は以下の通りです。
オブジェクト.メソッド名(引数の列挙)
たとえばリストオブジェクトには、appendメソッドという要素を追加するメソッドがあります。
l_1 = ['A','B','C'] l_1.append('D') print(l_1) # ['A', 'B', 'C', 'D']を返す
次回はクラス
いかがでしょうか。オブジェクトはPythonの中核を占める要素ではないのでしょうか。しっかり理解したいところです。次回はクラスです。クラスを使ってオブジェクトを作ることができるのですが、どのように使うのでしょうか。お楽しみに!!