第13回目 オブジェクト指向

ページ名:第13回目 オブジェクト指向

このページの変更記録

  • 09/09 23:50 公開
  • 09/10 01:08 用語一覧の訂正,演算子のオーバーロードを追加
  • 09/12 08:37 課題2のテストを修正
  • 09/12 08:52 課題2の表現を変更

第13回課題実施報告は,応用編のため必須ではありません。
報告する場合は,9/20 までにしてください。


課題報告メールの件名は
A-303xxxx-13 名前
のように,してください。名前以外は,必ず,半角文字を使用してください。
最初は,A or B で,クラス(A, B は,大文字で半角文字を守ること)
次の数字は,学生番号(y303xxxx) なら,303xxxx の7桁とすること
最後は,報告する授業の回数です。
間の - は,半角のマイナス記号です。
応用編に入ったら報告するかしないかは,自由です。ただし,最終課題の報告は必須です。



教科書『Python Pocket Reference』
⇒ 教科書 p.数字,と書いてあれば,そこをみて,印をつけておくことをおすすめ。
この講義では,自分のために役立つプログラムを作成できるようにする。料理でいうと,自炊ができるレベルを目指す。


初期化プログラム

今回は,必要なし
Python の動かし方
講義では,Jupyter Notebook を利用しています。以下を見ておくといいです。


データ型(クラス)を作る

 変数は,それぞれ,整数型,文字列型,タプル型,辞書型など,型を持っていました。その型を,自分でも作ることができます。今回は,独自の型(クラス)を作ります。


 例として,食塩水型を作りましょう。


 食塩水の濃度などを頻繁に計算するときに,「食塩水型」あると便利です。


 食塩水型(Saline)を作り,それをもとに,濃度 3 % の 200 g の食塩水を a を作ります。


class Saline: #教科書 p.95

 def __init__(self, p, g):
   self.p = p
   self.g = g

#テスト
a = Saline(3, 200) #食塩水クラスの中の __init__( ) で,3, 200 の値を保管
a.p, a.g


 濃度と重量が,食塩水型の変数,a の中に,a.p, a.g として保管されました。


関数を作成する


 この食塩水クラスは,濃度と重量を値として保持していますが,食塩の量は不明です。しかし,食塩の重量は計算すれば求めることができます。その関数を作ってみましょう。



#getSalt( ) 関数を作る
def getSalt(p, g):

 ans = (p/100) * g
 return ans

#テスト
a = Saline(3, 200)
getSalt(a.p, a.g)


この関数は,食塩水の食塩を算出する関数ですので,食塩水クラスの中に,書くことにします。そうすると,コピーして使用するときに,食塩水クラスと塩を求める関数がまとめて,コピーでき便利です。



class Saline:

 def __init__(self, p, g):
   self.p = p
   self.g = g

 def getSalt(self):
   ans = (self.p/100) * self.g
   return ans
   

#テスト
a = Saline(3, 100)
a.getSalt()


クラスの外で書かれたさきほど関数は


def getSalt(p, g):

 ans = (p/100) * g
 return ans


でしたが,クラスの中で定義された関数は

 def getSalt(self):                        #self が登場
   ans = (self.p/100) * self.g         # p, g にそれぞれ,self. がつく
   return ans


となります。水溶液の名前,a に当たるところが,self と一般化されます。


食塩水の加法を考える

 2種類の食塩水を混合した場合を考えます。
 例として,濃度 3 %, 100 g の食塩水と,濃度 9 %, 100 g の食塩水を混ぜたときの濃度と重量はどうなるか,プログラムで計算してましょう。6%, 200 g が求まれば正解です。


class Saline:

 def __init__(self, p, g):
   self.p = p
   self.g = g

 def getSalt(self):
   ans = (self.p/100) * self.g
   return ans
   

#テスト
a = Saline(3, 100)
b = Saline(9, 100)
s = a.getSalt() + b.getSalt()
g = a.g + b.g
(s/g)*100, g


食塩水の加法(演算子 + )を定義する


 食塩水の混合計算は,食塩水を扱うときに,当然ある計算です。食塩水クラスの中に入れることにします。
二種類の食塩水を扱うため,加法の定義に,self, other を使います。
 加法の記号(+)を定義することを,演算子のオーバーロード(多重定義)といいます。演算子(+)は,数値の加法をするとすでに定義済みです。そこに新たに,食塩水同士の加法を追加定義するということで,オーバーロード(多重定義)といいます。



class Saline:

 def __init__(self, p, g):
   self.p = p
   self.g = g

 def getSalt(self):
   ans = (self.p/100) * self.g
   return ans

 def __add__(self, other): #教科書 p.126
   s = self.getSalt() + other.getSalt()
   g = self.g + other.g
   p = (s / g) * 100
   return Saline(p, g)
   

#テスト
a = Saline(3, 100)
b = Saline(9, 100)
c = a + b
c.p, c.g


食塩水を混合するとき,食塩水クラスを利用すると,食塩水 a, b の混合は


c = a + b


と書くだけで,濃度,重量を自動計算することができます。


オブジェクト指向とは


 クラスの機能を使ったプログラムをオブジェクト指向プログラムといいます。



#テスト
a = Saline(3, 100)
b = Saline(9, 100)
c = a + b
c.p, c.g

この部分を,食塩水クラス(Saline)を使わないと



a_s = getSalt(3, 100)
b_s = getSalt(9, 100)
c_g = 100 + 100 #重量の計算
c_p = (a_s + b_s)/c_g * 100
c_p, c_g

となります。


 濃度の計算などこのプログラムを複雑にするところが,食塩水クラスを使うと,食塩水クラスの中に書かれます。
このように,プログラムの複雑なところを,操作対象(オブジェクト)に書くというのが,オブジェクト指向型プログラムといいます。この場合だと,保持する変数,使う関数を食塩水クラスに書きました。


 オブジェクト指向プログラムの用語は,本によって定義にぶれがあり,混乱しやすいです。
ここで,確認しておきます。


オブジェクト:操作の対象です。Saline, a, b です。 クラス,インスタンスともにオブジェクトです。
クラスオブジェクトが持つ,変数,関数が定義されます。Saline です。p, g, init, add などが定義されています。
インスタンス:クラスから生成されるものです。a = Saline(3, 100) と書くと,a インスタンスが,Saline クラスで作られます。
メソッド:オブジェクトが持つ関数です。a.getSalt( ) の getSalt( ) です。
プロパティ:オブジェクトが持つ変数です。a.p の p です。


 プログラム関係の本・ウェブの記述を読んで混乱しやすいのは,用語の定義が微妙に違うからです。ここでの定義にそって,読み替えすれば,大丈夫です。


課題1

 a.getWater() で,食塩水に含まれる水の重さを求めるようにしなさい。getWater( ) をSaline クラス内で定義します。


課題2

 水溶液 a を分割する演算 a / 3 の / を定義しなさい。Saline クラス内で,__truediv__ を定義します。(教科書 p.126)
以下のテストで,(3, 50) が表示されたら,正解です。濃度が 3 のままで,重量が,100/2 の答えが表示されます。


#テスト
a = Saline(3, 100)
b = a /2
b.p, b.g


課題報告は

  • 課題(どちらだけでもよい)を実施した感想,あれば質問

それに加えて
「クラスの中に,変数と関数を書けるようになった」と書き
プログラムも書いてください。


(投稿された他の学生のものはコピーして修正しないこと。これをやると伝言ゲームのようにだんだんおかしなプログラムになる)



登場した用語

  • オブジェクト指向
  • クラス
  • インスタンス
  • メソッド
  • プロパティ
  • 演算子のオーバーロード

質問と返答

講義への質問は,suehiro3721p@gmail.com まで


講義メモ(先生のための覚え書き)

シェアボタン: このページをSNSに投稿するのに便利です。


最近更新されたページ

トップページ

https://wiki3.jp/MathPython 内で書かれていることは,ご自由にご利用ください。管理者により改変されることもあります。工学部学生のための Python 入門(大学のプログラム入...

Python の動かし方

Jupyter Notebook を使うほぼ互換の Google Colaboratory を使うGoogle ドライブの中で,「新規」の「その他」の中で,Google Colaboratoryを選ぶ...

第14回目 課題実装例

このページの変更記録09/19 執筆中第14回目の課題はありません。今後の Python 利用 Pyrhon プログラムの料理でいうと自炊レベルとは,必要に応じて,自分専用の関数を作れることといってい...

第11回目 辞書型

このページの変更記録08/24 公開09/27 課題報告メモを削除09/27 サンプル一部変更教科書『Python Pocket Reference』⇒ 教科書 p.数字,と書いてあれば,そこをみて,...

第15回目 単位課題

このページの更新記録1019 質問への返答追加08/12 00:15 準備運動のようにキーボード練習をする,を追加08/13 13:16 質問への返答追加。締め切りについて。09/19 16:49 課...

第10回目 インストール

このページの変更記録08/16 17:12 公開08/31 15:07 分子コードの例を追加,文章の言い回し一部訂正インストールAnaconda(アナコンダ)をインストールする 2020年夏現在,Py...

第5回目 For ループ

このページの変更記録08/01 09:09 公開 08/01 09:15 訂正 08/01 12:19 サンプルプログラムに行が余分に空いて表示されると書く08/01 12:54 用語に,「ブロック」...

py3Dmol で画像が出ない。

ブラウザのキャシュエラーキャシュをクリアをする。Ctrl キー押しながら,更新ボタンをおすまたは,キャシュクリアーするツールを起動するChromebook だとhttp://atomurl.net/c...

第8回目 CSVファイル

このページの変更記録08/07 17:52 公開08/07 18:08 誤字訂正,言い回し変更08/08 00:32 サンプルプログラムに「#確認用表示」のコメントを追加08/08 00:36 課題文...

モジュール

ソースプログラムの保管単位 Python 言語の仕様上最初から入っているもの標準モジュールインストール時にいっしょに入るもの外部モジュール組込みモジュール,標準モジュール でないモジュール。組込みモジ...