\副業初心者が選ぶべきクラウドソーシングサービス4選/

pythonのオブジェクト指向とは

※当サイトはアフィリエイト広告を利用しています

python勉強

このブログでは、

私がPython勉強で学んだことを自分への備忘録も含めて書いています。

文系出身で、初めてのプログラミングに挑戦中です。

前回の勉強内容はこちら。

本日は、Pythonのオブジェクト指向について学んでいきます。

スポンサーリンク

Pythonのオブジェクト指向とは

オブジェクト指向とは、

システムを「オブジェクト同士の相互作用」として考える「設計手法」や「開発手法」のことで

プログラミングをする上でなくてはならない概念なのですが

初めて学ぶ私には非常に理解が難しかったです。

なぜなら、オブジェクト指向は概念であって正解がないからです。

ざっくりというと、

あるシステムで作ったプログラムを、他のプログラムで再利用するために

オブジェクトという形にまとめて再利用しやすくしているんです。

オブジェクトという概念が生まれる前までは

手続き型プログラミングといって「処理」と「データ」が分離して設計されていました。

こうすることで

処理だけを修正したり、データのみを入れ替えることができるため、

メンテナンス性が高いと考えられていたからです。

しかし、その処理やデータを他のシステムで再利用しようとすると、

複数の処理とデータが複雑に絡み合っているため、

再利用が困難であることが分かってきました。

そこで、処理とデータを分離するのではなく、

「オブジェクト」という単位でまとめることで、

プログラムの再利用性を高めようとしたのが、「オブジェクト指向」です。

オブジェクト指向をポケモンに例えてみよう

例えば、ポケモンで例えてみ

ピカチュウは矢印ボタンを押すと進む。Aボタンでジャンプする。
ゼニガメは矢印ボタンを押すと進む。Aボタンでジャンプする。
ヒトカゲは矢印ボタンを押すと進む。Aボタンでジャンプする。

というプログラムの書き方をしたとすると、もちろんこれでも指示通りに動きます。

でも、これがキャラクターが実は151匹出てくるんだとすると

151人分プログラムを書かなくてはいけません。
(管理人はポケモン151匹世代ですw)

そして、もし途中で「Bボタンを押したら技を出せるようにしよう!」

という仕様をつけようと思ったら大変です。

そこで、最初に「キャラクター」というオブジェクトを定義しておき

「キャラクター」は矢印ボタンを押すと進む。Aボタンでジャンプする。
ピカチュウは「キャラクター」をコピーして、黄色にする
ゼニガメは「キャラクター」をコピーして、緑にする
ヒトカゲは「キャラクター」をコピーして、赤にする

というように、書いておけば、Bボタンを押したら技を出せるようにしよう!と思った時に

「キャラクター」のプログラムだけを変更すればいいことになるというわけです。

オブジェクト指向のメリットとデメリット

オブジェクト指向のメリットには

・システムの構成が分かりやすい
・テストがしやすい
・プログラムの修正がしやすい
・プログラムの再利用がしやすい
・大人数で開発するときに便利

といったメリットがあります。

一方で、デメリットとしては

・小さなプログラムでは、コードの量、テストの量が増えてしまう
・そもそもコードを再利用しないのであれば意味がない

ということがあげられます。

オブジェクト指向の基本用語【クラス】

Pythonのオブジェクト指向では、クラスを使ってオブジェクトを生成します。

クラスでは、「属性」と「振る舞い」を定義します。

Python では、

属性は変数で表現し、振る舞いは関数(メソッド)で表現します。

これを読んだだけでは意味が分からないので

具体的なコード事例で理解を深めていきます。

クラスの定義

まず、クラスのコードの書き方は

class クラスの名称
   属性,メソッド

というような書き方をします。

Python は、クラスから二種類のオブジェクトを生成でき

ひとつは「クラスオブジェクト」、もうひとつは「インスタンスオブジェクト」です。

クラスオブジェクトとインスタンスオブジェクトの違いは、

クラスオブジェクトがメモリー上にひとつしか存在しないのに対して、

インスタンスオブジェクトは、複数生成することが可能です。

クラスオブジェクトかインスタンスオブジェクトかで、属性とメソッドの定義方法が変わってきますが

ここでは、インスタンスオブジェクトについて学習します。

インスタンスオブジェクトの属性とメソッドの定義

まずは、インスタンスオブジェクトの定義の仕方に属性書き方です。

class pokemon : 
    def __init__(self, poke_name, poke_color) : 
        self.poke_name = poke_name 
        self.poke_color = poke_color

ここでのポイントは、

「self」 という名前でインスタンスの参照を受け取る仮引数を定義する事
「__init__」(コンストラクタという)を使って、インスタンス属性の初期化をしている事

です。

こうやって書くんだな、と思っておけばいいと思います。

では、次にここにメソッドを追加してみます。

class pokemon : 
    def __init__(self, poke_name, poke_tokuiwaza) : 
        self.poke_name = poke_name 
        self.poke_tokuiwaza = poke_tokuiwaza 
    def battle(self) : 
        print(f'{p.poke_name}戦う')
        print(f'{p.poke_tokuiwaza}を出す')
p = pokemon('ピカチュウ','電気ショック')
p. battle()

これを実行すると

ピカチュウ戦う
電気ショックを出す

という結果が返ってきます。

だいぶ、プログラミングっぽくなってきましたね。

pythonのオブジェクト指向まとめ

今回は、Pythonのオブジェクト指向について学んできました。