Python のオブジェクトってなに?





辞書の集まりです。





f:id:domodomodomo:20161101224658p:plain









このページでは、オブジェクトの「仕組み」、 「どうやって動いているか」というちょっと厄介な話について取り扱います。

全力で頑張って書いてはいますが Python を習いたての方には、 抽象的過ぎてあまり面白くないかもしれません。

class を使ったオブジェクトの具体的な「考え方」や「使い方」を知りたいという方は、 霧島京子先生に教えてもらうといいかもしれません。

f:id:domodomodomo:20181220175826p:plain

Python入門編8: クラスを理解しよう - Paiza

















では、ここから先は、オブジェクトの「仕組み」、 「どうやって動いているか」というちょっと込み入った話について考えていきたいと思います。

オブジェクトって具体的に何を指してるの?



クラスオブジェクトから
インスタンス化されたもの




>>> # インスタンスオブジェクト
>>> 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 に詳しくなるサイト