pythonのオブジェクトって何?クラスもオブジェクト?

こんにちは。関東の大学に通う大学生ミンチ(@programminchi)です。今回はpythonについて学んでいく上でよく出てくるオブジェクトについて詳しく説明していきたいと思います。

pythonでは小数や文字列、もっと言えば関数やクラスさえも全てオブジェクトとして実装されており、オブジェクトを理解せずにpythonを理解するのは無理と言ってもよいほど大事な概念になります。

初心者にとって理解しにくいクラスの概念なども、オブジェクトについて学ぶことで理解しやすくなるので、是非この機会にしっかり理解していってください。

 

 

pythonにおけるオブジェクトについて理解しよう

皆さんはオブジェクトと言われて何を想像するでしょうか。プログラミングをやったことがある人なら一度は聞いたことがあると思うのですが、あまりよく分かっていない人も多いでしょう。

以下では順を追ってオブジェクトについて見ていきましょう。

 

オブジェクトとは?

オブジェクトを英語から日本語にそのまま訳してみると「物体、対象、目的」などという言葉に訳されます。

実際、オブジェクトについてはデータと処理を集めた物体などと理解しておけばよいでしょう。

変数や関数をひとまとまりにしたものということもできます。

ここで大切なことは、冒頭でも述べた通り、pythonではすべてがオブジェクトであるということです。リストも関数もクラスも全てがオブジェクトです。

 

本当に全てがオブジェクトなの?

例えば、以下の例を見てください。

>>>a = 3
>>>type(a)
int

 

変数aに整数3を代入しています。2行目のtype()関数はオブジェクトの型を調べるための関数です。

変数aはオブジェクトであるため、type()関数を適用してあげると、int型であるということが分かります。

 

それでは他の例も見ていきましょう。

>>>list = ['banana','melon','cherry']
>>>type(list)
list

今度は上とは違って複数の値を持つリストについて調べています。

当然リストもオブジェクトなので、type()関数を適用してあげるとlist型であるということが分かります。

同様にしてタプルや辞書についても調べてみるとよいでしょう。

 

それでは次に関数やクラスについて見ていきましょう。

ここまではわりかし誰でも知っていることかもしれませんが、関数やクラスまでもオブジェクトであるということはまだイメージがわきにくいかもしれません。

以下で確かめていきましょう。

>>>def hello():
…    print('hello')
>>>type(hello)
function

まずはhelloというだけの簡単な関数を作ってみました。type()関数でhello関数について調べてみると、function型であることが分かります。

 

次にクラスについて見ていきましょう。

>>>class Nothing():
…    pass
>>>a = Nothing()
>>>type(a)
__main__.Nothing

ここでは簡単にするために中身は空っぽのNothing()クラスを作りました。

3行目ではNothing()クラスからインスタンスaを作っています。

インスタンスについて説明していると長くなってしまうので、とりあえずインスタンスはクラスという設計図から作られたものという風にとらえておいてください。

そして、Python3においてはインスタンスとはクラスから作られたオブジェクトであると言い換えることができます。

つまり上のインスタンスaもオブジェクトであり、type()関数で調べてみるとNothing型であると表示されることが分かります。

クラスは型のように扱うことができるので、Nothingクラスから生成されたインスタンスはNothing型になるのは納得できるでしょう。

 

クラスから生成されたインスタンスはオブジェクトであり、そのクラスの型を持つことが分かりましたが、クラス自体ではどうでしょうか。

先ほどクラスは型のように扱うことができると言いましたが、型もまたオブジェクトなので他のオブジェクトと同様に型を持っています。

>>>type(Nothing)
type
>>>type(int)
type

上記のようにtype()関数でNothingクラスの型を調べてあげるとtypeという風に出てきます。

これによってクラスNothingがtypeから生成されたオブジェクトであり、type型を持つことが分かります。

型の型はtypeなので上のようにintにtype()関数を適用してあげても、typeと出力されるのが分かると思います。

 

さらに言うと、pythonではすべてがオブジェクトなのでtypeもオブジェクトであるということになります。

>>>type(type)
type

上のようにtypeの型を調べてあげると、typeと出力されます。
つまり、typeは自分自身を型に持つことが分かります。

このように順を追って見ていくことで、pythonでは全てがオブジェクトであるということが分かるはずです。

 

 

オブジェクト指向とは?

オブジェクト指向という言葉もよく聞くことがあると思いますが、これは何を表しているのでしょうか。

オブジェクト同士の相互作用として、システムの振る舞いをとらえる考え方である。
出典:Wikipedia

つまり、全てがオブジェクトであるpythonは当然のことながらオブジェクト指向のプログラミング言語であるということができます。

他にもよく聞く言語では、JavaやRuby、C++などもオブジェクト指向のプログラミング言語です。

上の説明ではオブジェクト指向プログラミングのメリットがあまり分からないので、1つ例を挙げましょう。

今、ゴリラとカラスとヒトをプログラムするとします。

それぞれは共通のデータ(属性)として体長と体重を持っており、処理(関数)として食べると寝るを持っています。

また、ゴリラはドラミングができ、カラスは飛ぶことができ、ヒトは歌うことができます。

この時、もちろん上のように1つずつ全部プログラムをしていってもよいのですが、何度も同じプログラムを書くことになります。

こんな時に以下のようにします。

あらかじめ、アニマルオブジェクトを作り、データ(属性)として体長と体重、処理(関数)として食べると寝るをプログラムします。

その後にアニマルオブジェクトからゴリラオブジェクト、カラスオブジェクト、ヒトオブジェクトを生成し、それぞれに必要なデータや処理だけ付け加えてあげればよいのです。

また、体長や体重などもインスタンスを生成する時に簡単に初期化できます。

今は3つしかオブジェクトを生成していないからあまり時間が変わらないように感じるかもしれませんが、仮に動物を1000体作りたいときは、明らかにこちらの方が早いと分かるはずです。

 

このようにオブジェクト指向のプログラミング言語は、変数や関数をひとまとまりに持つオブジェクトを、操作することができるので、その他のプログラミング言語よりも効率の良いプログラムを実行することができます。

 

 

まとめ

今回はpythonにおけるオブジェクトがどういうものなのか1つずつ見ていきました。

pythonでは、クラスなども含めて全てがオブジェクトということであまりなじみがないので、最初は理解しづらいかもしれませんが、大切なことなのでじっくり考えてみてください。

 

今後も定期的にコンピュータ系の記事を発信していくので是非、興味のある人はツイッターの方もフォローお願いします!!


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です