人工知能Ai第9回 クラスとオブジェクト 関数の後
はいそれでは第9回
人工知能Aiのプログラミング講座をはじまめます。
(テンション高めにお願いいたします。)
今回はクラスとコンストラクタそしてオブジェクト指向について
説明させて頂きます。
ここはpythonにおいて大変重要な章です。
少し長い講座とはなりますが、プログラミングで詰まる最初の難関ですので是非最後までご覧ください。
もうすでにみなさんはご存知かもしれませんが、
Pythonはオブジェクト思考という考え方に基づいて設計されたプログラミング言語です。
オブジェクト指向を既に勉強した人の中には、
オブジェクト指向とは、「オブジェクト,物、を中心とする考え方」のことです。
と説明を聞いたことがある人がいるかもしれません。
これを聞いて、感の言い方はすぐに把握できるかもしれませんが、
お恥かしながら、私は全く理解できませんでした。
私と同じように思った方も中にはいると思います。
安心してください、これから順を追って説明していきます。
ーーーーーーーーーーーーーーーーーーーーーーーーーーー(人工知能Ai)
●●●たいち担当)オブジェクトイメージ図表示
まずクラスについて説明します。
前回の講座で関数は一連の処理をまとめるものですと説明しましたね。
簡単に言いますと、クラスはさらにその関数をまとめたものです。
クラスは関数と同じく、呼び出さないと処理ができません。
クラスはオブジェクトを生成し、それを実際のプログラムとして扱うことで処理ができます。
簡単に言いますとクラスは自身のクラスの分身を作ります、これをオブジェクトと呼び
生成した分身でプログラムの処理がされるというイメージです。
車で例えると
車ではアクセル制御、ブレーキ制御、ハンドル制御と大きく3つに分けることができますよね。
このアクセル制御のプログラムをクラスで作ってしまえば、オブジェクトつまり分身を作ることで
そのクラスを別の製品のバイクなどでも、バイクアクセル制御としてそのまま使えるということです。
ただ、厳密にはそういったことは難しいのですが、イメージとしてクラスにまとめることで、複数ものとして扱うことができるということです。
それがオブジェクト指向というものです。
ーーーーーーーーーーーーーーーーーーーー(イメージ図終了)
ーーーーーーーーーーーーーーーーーーーーーーーーーーー(人工知能Ai)
実際にプログラムを見ていきましょう。♪( ´θ`)ノ
クラスの基本式はこのように記載します。
class クラス名
処理
クラス名はclassキーワードの後に書きます。
このクラス名は変数名や関数名と同じで自由に決めて大丈夫です。
ただ、同じファイル内に同じクラス名を書くことできません。
ここで、少し補足説明ですが、クラスはオブジェクト指向プログラミングでの
基本単位です、ですのでクラス名を書いた場合は中身を書かなくてはなりません。
何も記載しない場合はエラーが表示されます。試しに何も記載しないクラスを書いてみましょう
class Car
この時点でエラーの確認ができますね。
ですので、クラスを記載しましたらかならず、処理も記載しましょう。
はい、それではオブジェクト指向を考えるために
クラスを使って車のアクセル制御を簡単に表現したいと思います。
このように記載して見ます。
#P01=ペダルを踏むとONorOFF代入されます
accel_on=OFF #初期化処理
class Car
accel_on=P01 #accel_on変数にペダル情報を入れ込む
def car_accel ()
ifaccel_on==ON:#アクセルペダルが踏み込まれていた時
speed_on=100#スピード100で動かす。
簡単にこのプログラムを説明しますと。
1行目のaccel_on=P01というのは
実際の車のアクセルペダルを踏んだ情報、P01をaccel_on変数に代入します。
そして2行目のcar_accel関数内で、accel_on変数にONが代入されていた場合は
車のスピードを上げるため、speed_on変数に100を代入しています。
ーーーーーーーーーーーーーーーーーーーーーーーーーーー(人工知能Ai)
そしてここからが凄く重要です。
冒頭でも説明しましたが、クラスは関数と同じく、書いただけでは、
クラスプログララムを使用することはできません。
イメージとして、クラスはまだ設計図の段階というイメージです。
難しいですがクラスを使用するにはこの設計図を実態化つまり分身させる必要があります。
そして実態化させることをインスタンス(オブジェクト)の生成と言います。
インスタンス生成の基本式はこのように記載します。
変数名=クラス名()
今回の場合ですとa=Car()という表現になります。
変数にクラス名()を代入します。
簡単に説明しますとこの大きなプログラムCarクラスをそのまま変数という実態に入れ込むというイメージです。
そして実態化させたクラス内の関数を実行したい場合はこのように書きます。
変数名.関数名
今回の場合ですと、a.test()という表現になります。
わかりやすく言いますと。このドットを日本語の「の」と置き換えるとイメージしやすいかもしれません。
それでは、実際にプログラムを見てみましょう。
まずはインスタンスを生成せずに実行してみます。
class Car:
accel_on=P01 #accel_on変数にペダル情報を入れ込む
def car_accel ():
ifaccel_on==ON:#アクセルペダルが踏み込まれていた時
speed_on=100#スピード100で動かす。
print(‘watson’)
↓↓↓追加
def test ():
print(‘呼び出されました’)
↑↑↑追加
これで実行してみますと
実行結果には何も出力されませんでした。
ここでインスタンスを生成し、クラス内部の関数を呼び出してみます。
class Car:
accel_on=P01 #accel_on変数にペダル情報を入れ込む
def car_accel ():
ifaccel_on==ON:#アクセルペダルが踏み込まれていた時
speed_on=100#スピード100で動かす。
print(‘watson’)
def test ():
print(‘呼び出されました’)
↓↓↓追加
a=Car()
a.test()
↑↑↑追加
これで実行してみますと
実行結果に「呼び出されました」のみが出力されました。
ここで着目して欲しいにのがcar_accel関数が処理されていないことが確認できます。
このように、クラスを利用したい場合はクラス実体化させ
つまりインスタンス生成をし、生成したオブジェクトにドットをつけてアクセスさせます。
ーーーーーーーーーーーーーーーーーーーーーーーーーーー(人工知能Ai)
ここまでクラスについて説明してきましたが
実際にクラスをメリットに感じていない方がほとんどだと思います。
ですので、実際にクラスの特徴である複数のオブジェクト(インスタンスの生成)を使った
場合のプログラムを見てみましょう。
例えばここでは、エアコンについて考えてみます。
最近のエアコンでは、自動温度調節機能や、音声認識機能、人感センサー機能など幅広い機能が備わっています。
製品によっては全ての機能を兼ね備えたエアコンもありますが、自動温度調節機能のみのエアコンもあります。
これは企業様が顧客のニーズに対して、様々な機能をカスタマイズさせ低価格から高価格な製品まで販売できるよにした戦略です。
製品の機能によって価格は変動しておりますが、
実は中身のプログラムは同じ制御されていることがほとんどです。
実際にどういったプログラムか見て見ましょう。
このように書いて見ます。
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__という特殊な関数でしたね。
次回の講座からは実務応用編です。
実務で必ず使用する標準ライブラリーについての説明をしていますので、是非ご覧ください。
- はい以上で、ワトソン博士の人工知能Ai講座を終了と致します。ご静聴ありがとうございました♪( ´θ`)ノ。