Python のオブジェクトってなに?
このページでは、オブジェクトの「仕組み」、 「どうやって動いているか」というちょっと厄介な話について取り扱います。
全力で頑張って書いてはいますが Python を習いたての方には、 抽象的過ぎてあまり面白くないかもしれません。
class を使ったオブジェクトの具体的な「考え方」や「使い方」を知りたいという方は、 霧島京子先生に教えてもらうといいかもしれません。
では、ここから先は、オブジェクトの「仕組み」、 「どうやって動いているか」というちょっと込み入った話について考えていきたいと思います。
オブジェクトって具体的に何を指してるの?
インスタンス化されたもの
>>> # インスタンスオブジェクト >>> girl_friend = GirlFriend('サーバルちゃん') >>>
あるいは
例えば、整数 1
, 文字列 'Hello, world!'
, リスト [1,2,3]
は変数に代入できます。
このことから、整数 1
, 文字列 'Hello, world!'
, リスト [1,2,3]
は、インスタンスオブジェクトであることがわかります。
>>> # 変数に代入できるものはインスタンスオブジェクト >>> a = 1 >>> b = 'Hello, world!' >>> c = [1, 2, 3] >>>
もしかしたら「整数 1
がインスタンスオブジェクトです。」と言われても、実際にインスタン化している訳ではないので、いまいちピンと来ないかもしれません。
変数に代入する以外にも何かインスタンスオブジェクトであるかどうか確認する方法はないでしょうか?実は、インスタンスオブジェクトを使えば、「属性の参照」ができます。
ところで、インスタンスオブジェクトを使うと何ができるのでしょうか?インスタンスオブジェクトが理解できる唯一の操作は、属性の参照です。
9.3.3. インスタンスオブジェクト - Python チュートリアル
そこで実際に属性の参照ができるかどうかをみて、整数 1
がインスタンスオブジェクトであるかどうかを確認して見ましょう。
>>> # 整数 1 はインスタンスオブジェクト >>> a = 1 >>> >>> # だから、属性の参照ができる。 >>> # a の実部 >>> a.real 1 >>> >>> # a の虚部 >>> a.imag 0 >>>
正確には属性とは違いますが、同様に文字列 str も自分自身を構成するオブジェクトを参照することができます。
>>> b = 'Hello, world!' >>> b[0] 'H' >>> b[1] 'e' >>> b[2] 'l' >>>
◯ まとめ
1
や 'Hello, world!'
といったリテラルもオブジェクトだということがわかりました。さらに、リテラル自身もオブジェクトの集まりによって表現されていることがわかりました。
Python における私(Guido van Rossum)の目標の一つが、 すべてのオブジェクトを 「ファーストクラス」 にするというものであった。
これは、プログラミング言語の中のすべてのオブジェクト(数値、文字列、関数、クラス、モジュール、メソッドなど)に対して、 名前をつけて、同じように取り扱うことができるようになるということを意味している。
オブジェクトを変数に格納したり、リストの中に並べたり、辞書に格納したり、 引数として渡したり、といったことが可能になるのである。
すべてをファーストクラスに - The History of Python.jp
第一級オブジェクト - Wikipedia
第一級オブジェクト(ファーストクラスオブジェクト、first-class object)は、 あるプログラミング言語において、 たとえば生成、代入、演算、(引数・戻り値としての)受け渡しといった その言語における基本的な操作を制限なしに使用できる対象のことである。 (ワイの注釈: ざっくり言えば、変数に代入できるもの)
オブジェクトを構成する3つのもの
1. identity, 同一性
2. class, 型
3. value, 値
すべてのオブジェクトは、同一性 (identity)、型、値をもっています。
Every object has an identity, a type and a value.
3.1. オブジェクト、値、および型 - Python 言語リファレンス
型は type 関数で、同一性は id 関数で取得できます。しかし 値 は取得できません。まずは値は、属性くらいに考えておいて下さい。
値は Python ではやや抽象的な概念です: 例えば、オブジェクトの値にアクセスする正統な方法はありません。
6.10.1. 値の比較 - Python 言語リファレンス
class GirlFriend(object): def __init__(self, name): self.name = name girl_friend = GirlFriend('岩倉玲音') # 1. value, 値 girl_friend.name # 2. identity, 同一性 id(girl_friend) # 3. class, 型 type(girl_friend)
>>> # 1. value, 値 ... girl_friend GirlFriend(岩倉玲音) >>> >>> # 2. identity, 同一性 ... id(girl_friend) 4349015208 >>> >>> # 3. class, 型 ... type(girl_friend) <class '__main__.GirlFriend'> >>>
ここからは identity 同一性, class クラス, value 値 の3つについて、それぞれ触れることによって、オブジェクトの理解を深めていきたいと思います。
まずは identity から入ります。identity を理解するために、まずは、代入の復習から始めます。
1. identity 同一性
>>> id(girl_friend) 4441076568 >>>
2. class クラス
>>> type(girl_friend) <class '__main__.GirlFriend'> >>>
3. value 値
>>> girl_friend.name '岩倉玲音' >>>
まとめ
色々と書きましたが、結局、1つのオブジェクトは
と言うことが、もし伝わっていれば、幸いです。
下記の2記事は、C 言語を知らないと、すこし厳しいかもしれません。
CPython ではオブジェクトは、どのように設計されているのでしょうか。これまでの記事が、橋渡しになれまと思います。
Pythonの内部構造::PyObject ― CPythonの実装から内部に迫る | POSTD
また CPython のオブジェクトの実装のされ方について、批判があります。この記事もとても面白いので翻訳して見ました。
私が見たい Python - The Python I Would Like To See - いっきに Python に詳しくなるサイト