Python のオブジェクトって何?





オブジェクトの集まりです。





f:id:domodomodomo:20161101224658p:plain







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



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




>>> # インスタンスオブジェクト
>>> 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インスタンスオブジェクトです。」と言われても、実際にインスタン化している訳ではないので、いまいちピンと来ないかもしれません。

変数に代入する以外にも何かインスタンスオブジェクトであるかどうか確認する方法はないでしょうか?実は、インスタンスオブジェクトを使えば、「属性の参照」ができます。

ところで、インスタンスオブジェクトを使うと何ができるのでしょうか?インスタンスオブジェクトが理解できる唯一の操作は、属性の参照です。


そこで実際に属性の参照ができるかどうかをみて、整数 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!' といったリテラルもオブジェクトだということがわかりました。さらに、リテラル自身もオブジェクトの集まりによって表現されていることがわかりました。



オブジェクトを構成する3つのもの


1. value, 値
2. identity, 同一性
3. class, 型

すべてのオブジェクトは、同一性 (identity)、型、値をもっています。 3. データモデル — Python 3.6.5 ドキュメント



オブジェクトに関わる value 値は、attribue 属性に全て保存されています。しかし、identity 同一性と class 型は属性には保存されておらず、関数から参照します。

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)
>>> class GirlFriend(object):
...     def __init__(self, name):
...         self.name = name
... 
>>> girl_friend = GirlFriend('岩倉玲音')
>>> 
>>> 
>>> # 1. value, 値
... girl_friend.name
'岩倉玲音'
>>> 
>>> # 2. identity, 同一性
... id(girl_friend)
4441076568
>>> 
>>> # 3. class, 型
... type(girl_friend)
<class '__main__.GirlFriend'>
>>> 


ここからは value 値, identity 同一性, class 型 の3つについて、それぞれ触れることによって、オブジェクトの理解を深めていきたいと思います。

1. value

>>> girl_friend.name
'岩倉玲音'
>>> 

2. identity 同一性

>>> id(girl_friend)
4441076568
>>>

3. class 型

>>> type(girl_friend)
<class '__main__.GirlFriend'>
>>> 



まとめ

色々と書きましたが、結局、1つのオブジェクトは




オブジェクトの集まりなんやな。




と言うことが、もし伝わっていれば、幸いです。



CPython ではオブジェクトは、どのように設計されているのでしょうか。これまでの記事が、橋渡しになれまと思います。