クラスとオブジェクトとは
クラスとは、データとそれを扱う関数を1つにまとめた、オブジェクトの設計図です。オブジェクトは、その設計図から作った1つ1つの実物です。
プログラムが大きくなると、関連するデータと関数がばらばらになります。クラスにまとめれば、1つの部品として何度でも使えます。
このレッスンのゴール
メモ
身の回りのものを、状態と振る舞いを持つクラスとして設計することができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| クラス | 同じ種類のものの設計図 | Pen |
| オブジェクト | クラスから作った実物。インスタンスとも呼ぶ | Pen("黒", 120) |
| 属性 | オブジェクトが覚えているデータ。状態とも呼ぶ | self.price_yen |
| メソッド | クラスの中に書いた関数。振る舞いを表す | label() |
| self | そのメソッドを呼んだオブジェクト自身 | |
| __init__ | オブジェクトを作るとき、最初に動くメソッド |
学生が入力するセルは、このプレビューでは空白です。
クラスは状態と振る舞いの設計図
ペンには、色や値段のように、覚えておくデータがあります。これを状態と呼び、プログラムでは属性に入れます。
ペンには、説明を返すような動きもあります。これを振る舞いと呼び、メソッドとして書きます。
クラスは、この2つをまとめて書く場所です。
ペンのクラスを書いて動かす
class Pen:
# 新しいペンを作るとき、最初に1回だけ動きます。
def __init__(self, colour, price_yen):
self.colour = colour
self.price_yen = price_yen
# ペンの説明の文を返す、振る舞いです。
def label(self):
return self.colour + "のペン " + str(self.price_yen) + "円"
pen = Pen("黒", 120)
print(pen.label())
# 色を "赤" に、値段を 150 に変えて、もう一度実行しましょう。
同じクラスから作ったオブジェクトは別物
クラスを呼ぶと、オブジェクトが1つできます。Pen("黒", 120) を2回書けば、ペンが2本できます。
2本は同じ設計図から作っても、別のものです。片方の属性を変えても、もう片方は変わりません。
2つのカウンターは別々に数える
class Counter:
def __init__(self):
self.count = 0
def add(self):
self.count = self.count + 1
first = Counter()
second = Counter()
first.add()
first.add()
second.add()
print(first.count, second.count)
# second.add() をもう1行足すと、どうなるでしょう。
例: 2本のペンの状態
| オブジェクト | name | price_yen | with_tax() の答え |
|---|---|---|---|
| a | Pen | 120 | 132 |
| b、値段を直す前 | Marker | 200 | 220 |
| b、値段を300に直した後 | Marker | 300 | 330 |
学生が入力するセルは、このプレビューでは空白です。
ラボで自分のクラスを動かす
ラボの端末で、ペンのクラスを書いて動かします。3つの Run を、上から順に押してください。
ファイルの文字は英語だけにしてあります。端末の文字コードに、頼らないためです。
作業用のフォルダを作る
mkdir -p ~/oop/classesここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
そのフォルダへ移る
cd ~/oop/classesここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
クラスを書いたファイルを作る
printf 'class Pen:\n def __init__(self, name, price_yen):\n self.name = name\n self.price_yen = price_yen\n\n def with_tax(self):\n return self.price_yen * 110 // 100\n\n\na = Pen("Pen", 120)\nb = Pen("Marker", 200)\nprint(a.name, a.with_tax())\nprint(b.name, b.with_tax())\nb.price_yen = 300\nprint(a.price_yen, b.price_yen)\n' > shop.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ファイルを動かす
python3 shop.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
出力を読んで、別物だと確かめる
出力は3行です。Pen 132 と Marker 220 は、2本の with_tax の答えです。
最後の 120 300 は、b の値段だけを300に直した結果です。a の値段は120のままで、2本が別物だと分かります。
b の値段を500に書き換える
sed -i 's/b.price_yen = 300/b.price_yen = 500/' shop.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
最後の1行だけを見る
python3 shop.py | tail -n 1ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
「class を書いた時点で、オブジェクトが1つできている」と考える人が多くいます。class は設計図を書くだけです。オブジェクトは、Pen("黒", 120) のようにクラスを呼んだときに、初めてできます。