或阿呆のブログ

Pythonを好んで使っているプログラマです。Ruby,Perl,PowerShell,VBAなどでもたまに書いています。おバカなことが大好きです。

オブジェクト,クラス,インスタンスの違い

上手い説明が見つからなかったので自分なりに纏めた。

知恵袋を見たらこんなような珍回答があったので驚いた。

クラス:人間
インスタンス:男、女
みたいな感じ

確かに、そういうクラス定義にすれば、間違いではない場合もあるんだけど、根本的にポイントがずれている。

難しい説明は、ときに説明を複雑にするので、簡略に説明する。蛇使い(Python使い)なので、Python中心の例となっている点はご了承を。

wikipedia:オブジェクト指向

オブジェクト指向でなぜつくるのか 第2版  知っておきたいOOP、設計、関数型言語の基礎知識

オブジェクト指向でなぜつくるのか 第2版 知っておきたいOOP、設計、関数型言語の基礎知識

オブジェクトとは?

オブジェクト指向というパラダイムを説明する上でのオブジェクト

誰が何に対して何をする

の「何に対して」のところがオブジェクト。

言語仕様としてのオブジェクト

言語に相違はあると思うが、オブジェクトはインスタンスと同じ意味で使われることが多い。

クラスとは?

振る舞いを抽象化した型のこと。
#サンプルコード見てください。

インスタンスとは?

クラスを具象化したもの。
#サンプルコード見てください。

サンプルコード

クラスAを定義

>>> class A():
...     def set_name(self,name):
...         self.name=name
...         

クラスAはnameという属性を持ち、set_nameというメソッドを持つ。

クラスAの型をチェック

>>> type(A)
<type 'classobj'>

Pythonではclass修飾子を使って定義した型は、classobj型として扱われる。

インスタンスa1,a2を生成,インスタンスa1,a2の型をチェック

>>> a1=A()
>>> a2=A()
>>> type(a1)
<type 'instance'>
>>> type(a2)
<type 'instance'>

インスタンスa1,a2のアドレスを表示

>>> a1
<__main__.A instance at 0x97b67ec>
>>> a2
<__main__.A instance at 0x97b69ac>

インスタンスa1,a2はそれぞれメモリ領域を持つ。保持する値や、メソッドの対象となるメモリ領域が異なる。*1

インスタンスa1,a2のそれぞれのメソッドを使用して値を変更する

>>> a1.set_name('spam')
>>> a2.set_name('ham')
>>> a1.name
'spam'
>>> a2.name
'ham'

別別に生成されたインスタンスa1,a2はそれぞれ影響を受けない。*2

まとめ

クラスが振る舞いを抽象化した型で、インスタンスがクラスを具象化したもの。

お奨め書籍

初めてのPython 第3版

初めてのPython 第3版

*1:それでも、いずれも同じクラスであることには変わりはない

*2:もちろん、それぞれの値によって影響を受ける作りにすることも出来るが