オブジェクト(Python_20)

この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、osモジュールをご紹介しました。色々なファイルやディレクトリ操作ができます。

今回はオブジェクトです。Pythonの中核を占める要素ですね。

オブジェクトとは

まず、オブジェクトとはいったい何なんでしょうか。すべてのデータはオブジェクトと書きました。それではデータ以外のオブジェクトはあるのでしょうか。

Pythonでは、オブジェクトとはプログラムの実行時にコンピューターのメモリ上に作成された物を指します。メモリ上にある何かは、すべてオブジェクトと言えます。メモリ上の配置位置情報(アドレス)はそのオブジェクトがメモリから削除されるまでは変わりません。

Pythonのオブジェクトには、以下の3つの要素を持っています。

  1. オブジェクトID id関数で確認できる
  2. データ型 type関数で確認できる

データ型、値という要素があるということは、Pythonではオブジェクトはすべてデータであるといえると思います。「Pythonでは操作対象がデータ自体」と書いたことがあるのですが、あながち間違いでもなさそうです。

整数1もオブジェクトですので、これらを確認できます。

print(id(1)) # オブジェクトID 140724237353768(環境により異なる)を返す
print(type(1)) # データ型 <class 'int'>を返す
print(1) # 値 1を返す

とあるように、整数型のデータはクラス「int」をもとに作られているんですね。オブジェクトID、データ型、値を確認してみましょう。

関数オブジェクト

関数もコンピューターのメモリ上に読み込まれますので、オブジェクトになります。

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の中核を占める要素ではないのでしょうか。しっかり理解したいところです。次回はクラスです。クラスを使ってオブジェクトを作ることができるのですが、どのように使うのでしょうか。お楽しみに!!

hirocom777.hatenadiary.org

Python再学習のまとめはこちら!!