【python入門10】pythonでクラスとオブジェクト指向について理解しよう!

第10回 python入門 クラスとオブジェクト指向

今回はクラスとコンストラクタそしてオブジェクト指向について説明させて頂きます。ここはpythonにおいて大変重要な章です。少し長い講座とはなりますがプログラミングで詰まる最初の難関ですので是非最後までご覧ください。もうすでにみなさんはご存知かもしれませんが、Pythonはオブジェクト思考という考え方に基づいて設計されたプログラミング言語です。オブジェクト指向を既に勉強した人の中には、オブジェクト指向とは、「オブジェクト、物、を中心とする考え方」のことです。と説明を聞いたことがある人がいるかもしれません。

これを聞いて感の言い方はすぐに把握できるかもしれませんが、お恥かしながら私は全く理解できませんでした。

私と同じように思った方も中にはいると思います。順を追って説明していきます。まずクラスについて説明します。前回の講座で関数は一連の処理をまとめるものですと説明しましたね。簡単に言いますと、クラスはさらにその関数をまとめたものです。クラスは関数と同じく、呼び出さないと処理ができません。

クラスはオブジェクトを生成し、それを実際のプログラムとして扱うことで処理ができます。簡単に言いますとクラスは自身のクラスの分身を作ります、これをオブジェクトと呼び生成した分身でプログラムの処理がされるというイメージです。

車で例えると車ではアクセル制御、ブレーキ制御、ハンドル制御と大きく3つに分けることができますよね。このアクセル制御のプログラムをクラスで作ってしまえば、オブジェクトつまり分身を作ることで、そのクラスを別の製品のバイクなどでも、バイクアクセル制御としてそのまま使えるということです。ただ厳密にはそういったことは難しいのですが、イメージとしてクラスにまとめることで複数ものとして扱うことができるということです。

それがオブジェクト指向というものです。実際にプログラムを確認してみましょう。(๑╹ω╹๑ )

クラスの基本式はこのように記載します。

class クラス名:

処理

クラス名はclassキーワードの後に書きます。このクラス名は変数名や関数名と同じで自由に決めて大丈夫です。ただ同じファイル内に同じクラス名を書くことできません。ここで少し補足説明ですが、クラスはオブジェクト指向プログラミングでの基本単位です。ですのでクラス名を書いた場合は中身を書かなくてはなりません。何も記載しない場合はエラーが表示されます。試しに何も記載しないクラスを書いてみましょう

class Car:

この時点でエラーの確認ができますね。ですのでクラスを記載しましたら必ず処理も記載しましょう。はい、それではオブジェクト指向を考えるためにクラスを使って車のアクセル制御を簡単に表現したいと思います。

このように記載して見ます。

#P01=ペダルを踏むとONorOFF代入されます
accel_on=OFF #初期化処理

class Car:
        accel_on=P01 #accel_on変数にペダル情報を入れ込む
        def car_accel():
                if accel_on == ON:#ペダルが踏み込まれていた時
                        speed_on=100#スピード100で動かす。

簡単にこのプログラムを説明しますと。クラス内1行目のaccel_on=P01というのは実際の車のアクセルペダルを踏んだ時の情報、P01をaccel_on変数に代入します。そして2行目のcar_accel関数内で、accel_on変数にONが代入されていた場合は車のスピードを上げるため、speed_on変数に100を代入しています。そしてここからが凄く重要です。冒頭でも説明しましたがクラスは関数と同じく書いただけでは、クラスプログララムを使用することはできません。イメージとしてクラスはまだ設計図の段階というイメージです。難しいですがクラスを使用するにはこの設計図を実態化つまり分身させる必要があります。そして実態化させることをインスタンス(オブジェクト)の生成と言います。

インスタンス生成の基本式はこのように記載します。

変数名=クラス名()

今回の場合ですとa=Car()というような表現になります。変数にクラス名()を代入します。簡単に説明しますとこの大きなプログラムCarクラスをそのまま変数という実態に入れ込むというイメージです。そして実態化させたクラス内の関数を実行したい場合はこのように書きます。

変数名.関数名

今回の場合ですと、a.test()という表現になります。わかりやすく言うと、このドットを日本語の「の」と置き換えるとイメージしやすいです。

実際にプログラムを確認してみましょう。まずはインスタンスを生成せずに実行してみます。

class Car:
        accel_on=P01 #accel_on変数にペダル情報を入れ込む
        def car_accel():
                if accel_on == ON:#ペダルが踏み込まれていた時
                        speed_on=100#スピード100で動かす。
                        print("スピードを上げる")
        def test(self):
                print("呼び出されました")

これで実行してみますと実行結果には何も出力されませんでした。ここでインスタンスを生成しクラス内部の関数を呼び出してみます。

class Car:
        accel_on=P01 #accel_on変数にペダル情報を入れ込む
        def car_accel():
                if accel_on == ON:#ペダルが踏み込まれていた時
                        speed_on=100#スピード100で動かす。
                        print("スピードを上げる")
        def test(self):
                print("呼び出されました")
a=Car()
a.test()

これで実行してみますと、実行結果に「呼び出されました」のみが出力されました。

ここで着目して欲しいにのがcar_accel関数が処理されていないことが確認できます。このようにクラスを利用したい場合はクラス実体化させ、つまりインスタンス生成をし生成したオブジェクトにドットをつけてアクセスさせます。ここまでクラスについて説明してきましたが実際にクラスをメリットに感じていない方がほとんどだと思います。ですので、実際にクラスの特徴である複数のオブジェクト(インスタンスの生成)を使った場合のプログラムを見てみましょう。

例えばここでは、エアコンについて考えてみます。

最近のエアコンでは、自動温度調節機能や、音声認識機能、人感センサー機能など幅広い機能が備わっています。製品によっては全ての機能を兼ね備えたエアコンもありますが、自動温度調節機能のみのエアコンもあります。これは企業様が顧客のニーズに対して、様々な機能をカスタマイズさせ低価格から高価格な製品まで販売できるよにした戦略です。製品の機能によって価格は変動しておりますが、実は中身のプログラムは同じ制御されていることがほとんどです。

実際にどういったプログラムか確認してみましょう。このように書いて見ます。

class Air_con:
        def __init__ (self):
                self.product_name=0
                self.auto_temp=0
                self.voice_switch=0
                self.human_sensor=0
        def aircon (self):
                print(self.product_name)
                if (self.auto_temp==1):
                        print("は自動温度調整機能あり製品として処理がされます。")
                if (self.voice_switch==1):
                        print("は音声機能あり製品として処理がされます")
                if self.human_sensor==1:
                        print("は人感センサあり製品として処理がされます")
S_rank=Air_con()
S_rank.product_name="Sランク製品"
S_rank.human_sensor=1
S_rank.aircon()
A_rank=Air_con()
A_rank.product_name="Aランク製品"
A_rank.voice_switch=1
A_rank.aircon()
B_rank=Air_con()
B_rank.product_name="Bランク製品"
B_rank.auto_temp=1
B_rank.aircon()

このinit関数とself引数は今は無視してください。このようにAir_conクラス1つで複数のオブジェクトを生成し、同じプログラムから違う機能を持った製品を制御することができています。これがクラスの特徴であり強みです。

次に___init__コンストラクタについて説明します。コンストラクターとは簡単に言いますとクラスをインスタンス生成する際に一度だけ呼ばれるものです。一般的には初期化するものと覚えておいてください。

コンストラクタの基本式はこのように記載します。

def __init__ (self):

初期化処理

実際にプログラムを確認してみましょう。わかりやすくするため、あえてこのように記載します。

class Air_con:
        def __init__ (self):
                print("コンストラクタが呼び出されました")
        def aircon (self):
                print("エアコン関数内処理")
S_rank=Air_con()

順番に説明しますとこのエアコンクラスを使いたいときは、インスタンスを生成しますよね、ここまでは前回勉強した時と同じです。

これで実行して見ますと

このように「コンストラクタが呼び出されました」のみが出力されていることが確認できます。ここで少し注目して欲しいのですが、ここでは関数などは呼び出していないことです。どういうことかと言いますと、このAir_conクラスをインスタンスした時にこのコンストラクタが自動で呼び出されています。つまりこのコンストラクタというのはインスタンスしたときに自動で呼び出される特殊な関数と覚えておいてください。そしてここからは一般的なコンストラクタの使い方について説明致します。冒頭でも説明しましたが、コンストラクタは主に初期化処理に用います。プログラミング初心者の方はまだ馴染みがないかもしれませんが。初期化というのは変数に初期値を代入することで、プログラミングにおいてとても大切なことです。どいうことかと言いますと。変数に初期値が入っていない場合はプログラムが誤作動を起こしてしまう可能性があります。実際に確認してみましょう。

例えばこのように記載して見ます。

print(a)

これで実行して見ますとエラーが出力されました。

今回の場合ですと、エラーが出力されました。しかし、他の開発環境によっては0が出力されることがあります。この変数aには値を入れてないのに関わらず0という値が出力される場合があります。逆くを言いますと勝手に0が入っているということです。本来であればこのようにエラーが出力されるべきです。開発環境によっても値が変化する可能性があります。初期値が入っていない変数は不定値と呼ばれ、エンジニアのミスとなります。ですので、必ず初期化つまり初期値を入れるコンストラクタの処理はするようにしてください。

はい、今回はクラスとコンストラクタとオブジェクト指向についてということでオブジェクト思考の概念から、実際にエアコンを例にしたクラスを扱って見ました。クラスを利用したい場合はインスタンス生成をしないといけませんでしたね。そして最後に、初期化処理を行うコンストラクタについても説明しました。__init__という特殊な関数でしたね。

次回の講座からは応用編です。実務で必ず使用する標準ライブラリーについての説明をしていますので、是非ご覧ください。以上で、pyhon入門10を終了と致します。ご静聴ありがとうございました(๑╹ω╹๑ )

最近の記事

  • 関連記事
  • おすすめ記事
  • 特集記事

コメント

この記事へのコメントはありません。

CAPTCHA


PAGE TOP