IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第34回 Pythonで動く円のクラスを継承させて、三角や四角へ変更してみた (菱沼佑香) 2022年7月

こんにちは、吉政創成 菱沼です。
今回も「いちばんやさしいPython入門教室(大澤 文孝氏著) 」を片手に勉強していきます。
「クラス」と「オブジェクト」の概念を学ぶということで、その準備段階として、tkinterのcanvas上に動く円を作る方法について学びつつ、クラスとは何か、オブジェクトとは何かをざっくり学習してきました。
その後、オブジェクト指向によるクラスとメソッドの書き方を学びましたが、今回はこれまでに作った動く円のプログラムを使って、違う図形に変える方法について学んでみたいと思います。

クラスの中の1つのメソッドを3つに分解

前回でクラスとメソッドによる動く円のプログラムができていますが、今回は円を四角や三角に変えるようです。
-----
P.223、224
四角や三角を描画する場合、その違いは、「描画する形状」だけで、X座標やY座標を増減したり、キャンバスの端に達したときに向きを変えたりする処理は、全く同じです。
ですから、描画するところだけを切り替えれば、同じプログラムで実現できるはずです。
(中略)
クラスには、メソッド単位で処理を変更する機能があります。この機能は、「オーバーライド(override)」と呼ばれ、既存のクラスを改良して、別のクラスを作るときの基本となります。
繰り返しますが、この機能が使えるのは「メソッド単位」です。違うところは「消す」のと「描く」ところですが、ここを差し替えるには、それぞれ別のメソッドとして実装する必要があります。
そこでこれまで作ってきたBallクラスのmoveメソッドを変更します。
ここでは、消す処理を「eraseメソッド」、描画する処理を「drawメソッド」に分離します。
------

ということで、まず前回までに作った該当箇所を見てみます。それがこちら。

fig01

このプログラムでは円を「消す」「動かす」「描く」「端に行ったら折り返す」という4つの処理がmoveメソッドの中で行われていました。
今回、この円と同じ動きをする三角や四角を追加できるようにするために、「消す」と「描く」(緑と青で囲った)部分を切り出して、メソッド化させるようです。それが次の画像です。

fig02

これで今までmoveメソッドの中で書かれていた「消す」(緑枠)部分をeraseメソッド、「描く」(青枠)部分がdrawというメソッドに変わりました。moveメソッドには「動かす」と「端に行ったら折り返す」の2つだけが残っているという状態です。

親クラスを"継承"すれば、子クラスで同じような処理を簡単に作れる

さて、既存のクラスを基に、新しいクラスを作ることを「継承」というそうです。
ここでは基となるのがBallクラスであり、このBallクラスの設定を利用して作るのがRectangleとTriangleの二つのクラスということになります。
ちなみに基となるクラスのことを「親クラス」、親クラスを利用して作ったクラスを「子クラス」と言うようです。テキストでは基と新として書かれていますが、個人的に理解しやすいので引用部分以外は親・子クラスと書いていきます。
(注意:子クラスは親クラスを参照して書かれるため、親クラスより前に書くとエラーが起きます。)

----
P.224
継承するには、
class 新しいクラス名(基のクラス名):
とすればよく、同名で同じ動作をするメソッドの記載は省略できます。そこで、Ballクラスを継承させ、四角形を描画するRectangleクラスを作ると、次のようになります。

fig03

四角形を描画するには、create_rectangleメソッドを使います。ここに示したように、このRectangleクラスでは、処理が異なるeraseメソッドとdrawメソッドだけを作り、ほかは省略しています。つまり、moveメソッドはBallクラスに実装されたものと同じものが使われます。
(中略)
クラスでは、「オーバーライド」という言葉が出てきますが、このような「処理の上書き」こそが、オーバーライドの実体です。
------

Rectangleクラスによって上書きされた部分はeraseとdrawメソッドの「canvas.create_oval」の部分ですね。
この後、実際の円の値を与えるのと同じように、四角形の描画に必要な処理を書いてあげる必要があります。もともとの円の値はこう書かれていました。

fig04

では四角の時はどうすればいいかというと...

----
P.226

fig05

円を扱ってきたBallクラスとの違いは、

fig06

の1行だけで、「BallクラスではなくRectangleクラスを使うようにする」ことだけです。
-----------
たしかにBallがRectangleに置き換わってるだけですね。
三角形の場合はRectangleと書かれていたメソッド名をTriangleという名前に置き換えてあげることと、create_rectangleをcreate_ploygonという三角を描画するメソッドに変えてあげればいいという事になります。
実際に変えてみたのがこちら。
まずcreate_ploygonメソッドに変えたTriangleクラスです。

fig07

そして次に三角の描画部分です。

fig08

これで三角と四角、円のクラスが出来上がりました。
そして複数の円を書いたとき同様、リストにすることもできます。

----
P.228
このプログラムではまず、次のようにして、一緒くたに「円」「四角形」「三角形」を作り、それをリストとして構成しています。

fig09

そして、このballs変数をループ処理することで描画しています。

fig10

ここでポイントとなるのが、どのクラスもBallクラスから継承しており、すべて「moveメソッド」を持っているという点です。
このループで実行しているのは、そのオブジェクトの「moveメソッド」です。
(中略)どのオブジェクト化に関係なく、ただ「moveメソッドさえあれば、同じようにループ処理できる」のです。
-----

この辺は今までも出てきたところなので特に引っかかる部分はないかと思います。
ではここで出来たプログラムの全容を確認してみます。

fig11

RectangleとTriangleは親クラスであるBallクラスを利用した子クラスです。
そのため、子クラスは親クラスと連動しているので、実行されれば子クラスも一緒に動き、ループもまた同じくと親クラスと行動を共にするという理解することにしました。
そして一応実行してみたのがこちら。無事に三角と四角ができて動いていますね。

fig12

クラスとオブジェクトはプログラミング初心者にとってなかなか馴染みにくく、理解しにくい部分が多くありますが、いろいろなプログラムを考えていくことでうまく使えていくようなので、そうなったときには継承についても詳しく学習してみたいなと思います。
それでは今回はこちらで終了です。お付き合いいただきありがとうございました。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes