3秒でわかる
データとその操作をひとまとめにした型の定義。同じ構造を持つオブジェクトを何個でも作れる設計図として、規模の大きなプログラムの土台になります。
もう少し詳しく
どういうものか
クラスは、どんなデータ(属性)を持ち、どんな操作(メソッド)ができるかをまとめて定義したものです。定義しただけでは動かず、そこから作った実体をインスタンス(オブジェクト)と呼びます。
たとえば Coffee というクラスに「豆の種類」「サイズ」という属性と「価格を計算する」というメソッドを定義しておけば、latte や americano といったインスタンスを必要な数だけ作れます。属性の値はインスタンスごとに別々で、メソッドの中身は共通です。
なぜ必要か
関連するデータと処理が離れていると、片方だけ直す事故が起きます。辞書やリストで注文を表現していると、「金額の計算式」がプログラムの各所に散らばり、税率が変わったときに直し漏れます。
クラスにまとめておくと、変更点は 1 か所です。加えて、外から触ってよい操作だけを公開して内部の持ち方を隠せるため、内部構造を後から作り替えても呼び出し側を壊しません。
具体例
class Coffee:
tax_rate = 0.1 # クラス変数。全インスタンス共通
def __init__(self, name, base_price):
self.name = name # インスタンス変数
self.base_price = base_price
def price(self):
return round(self.base_price * (1 + Coffee.tax_rate))
def __str__(self):
return f"{self.name} {self.price()}円"
class IcedCoffee(Coffee): # 継承
def price(self):
return super().price() + 50 # 氷代を足す
latte = Coffee("ラテ", 500)
iced = IcedCoffee("アイスラテ", 500)
print(latte, iced) # ラテ 550円 アイスラテ 600円self は「このインスタンス自身」を指す第 1 引数で、呼び出し時には書きません。
つまずきやすいところ
self を書き忘れる — メソッドの定義に self が無いと呼び出し時に引数の数が合わずエラーになりますitems = [] と書くと全インスタンスで共有されます。個別に持たせるなら __init__ の中で self.items = [] としますCoffee.price() は動きません。インスタンスを作ってから latte.price() と呼びます似た用語との違い
| 用語 | 中身 |
|---|---|
| クラス | 定義。設計図そのもの |
| インスタンス | クラスから作られた実体 |
| コンストラクタ | インスタンス生成時に走る初期化処理 |
| 継承 | 既存クラスの定義を引き継いで拡張すること |
覚え方
クラスはたい焼きの型、インスタンスは焼き上がったたい焼きです。型は 1 つ、たい焼きは何個でも、中身のあんこ(属性の値)は個別に変えられます。