💡 この記事でわかること
- クラスとは何か、インスタンスとの関係
- class での定義、__init__ と self の役割
- 属性(インスタンスが持つデータ)とメソッド(クラス内の関数)
- 関数だけで書く場合との違い、クラスを使うメリット
- 継承(他のクラスの機能を引き継ぐ)の基本
1. クラスとは?
クラスとは、
👉 データ(属性)と処理(メソッド)をひとまとめにした「設計図」です。
💡 設計図であるクラスから、実際に使う「実体」を作ります。この実体をインスタンスと呼びます。たとえば「犬」という設計図(クラス)から、「ポチ」「ハチ」といった個々の犬(インスタンス)を作る、というイメージです。
それぞれのインスタンスは、自分専用のデータ(名前・年齢など)を持ちつつ、共通の処理(鳴く、など)を使えます。
2. クラスを定義する(class・__init__・self)
class Dog:
def __init__(self, name, age):
self.name = name # 属性(このインスタンスの名前)
self.age = age # 属性(このインスタンスの年齢)
def bark(self):
print(f"{self.name}がワンと鳴きました")class クラス名:で定義を始める(クラス名は大文字始まりが慣習)__init__は、インスタンスを作るときに自動で呼ばれる初期化用のメソッドselfは「そのインスタンス自身」を指す。属性やメソッドはself.〇〇で扱う
👉 メソッドの1つ目の引数は必ずselfにします。呼び出すときには自分で渡す必要はなく、Pythonが自動でセットしてくれます。
3. インスタンスを作って使う
pochi = Dog("ポチ", 3) # インスタンスを作成(__init__が呼ばれる)
hachi = Dog("ハチ", 5)
print(pochi.name) # ポチ(属性の参照)
print(hachi.age) # 5
pochi.bark() # ポチがワンと鳴きました
hachi.bark() # ハチがワンと鳴きました💡 クラス名(引数)でインスタンスを作れます。pochiとhachiは同じDogクラスから作られていますが、それぞれ別の名前・年齢を持っています。
4. 属性とメソッド
- 属性:インスタンスが持つデータ。
self.nameのようにself.を付けて定義・参照する - メソッド:クラスの中で定義された関数。インスタンスの属性を読んだり書き換えたりできる
メソッドの中から、自分の属性を変更することもできます。
class Counter:
def __init__(self):
self.count = 0
def increment(self):
self.count += 1
c = Counter()
c.increment()
c.increment()
print(c.count) # 2👉 メソッドは「クラスに属している関数」です。関数の基本を復習したい場合は、こちらの記事も参考にしてください。
👉 Pythonの関数(def・引数・戻り値)についての記事はこちら
5. 使用例:買い物カゴ
「データ」と「そのデータを操作する処理」がセットになっている例として、買い物カゴをクラスにしてみます。
class Cart:
def __init__(self):
self.items = [] # 商品を入れるリスト
def add(self, item):
self.items.append(item)
def count(self):
return len(self.items)
cart = Cart()
cart.add("りんご")
cart.add("パン")
print(cart.items) # ['りんご', 'パン']
print(cart.count()) # 2💡 カゴの中身(items)と、それを操作するメソッド(add・count)が1つのクラスにまとまっています。使う側はcart.add(...)と書くだけで、内部でリストをどう管理しているかを気にせず済みます。
👉 クラスの中でよく使う、リストと辞書についての記事はこちら
6. 関数だけの場合との違い
| 関数 | クラス | |
|---|---|---|
| まとめるもの | 処理だけ | データ(属性)と処理(メソッド)をセット |
| 状態(データ)の保持 | 基本は持たない | インスタンスごとに持てる |
| 向いている場面 | 入力→出力が明確な処理 | 「モノ」を表現し、状態を持たせたいとき |
👉 小さな処理はまず関数で十分です。「関連するデータと処理がいくつも増えてきて、まとめて扱いたい」と感じたときにクラスを検討しましょう。
7. 継承(他のクラスを引き継ぐ)
継承を使うと、あるクラスの機能を引き継いだ新しいクラスを作れます。共通部分を1回書けば済むようになります。
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print(f"{self.name}が鳴きました")
class Cat(Animal): # Animal を継承する
def speak(self): # 同じ名前のメソッドで上書き(オーバーライド)
print(f"{self.name}がニャーと鳴きました")
Animal("どうぶつ").speak() # どうぶつが鳴きました
Cat("タマ").speak() # タマがニャーと鳴きました💡 class Cat(Animal):と書くと、CatはAnimalの__init__やメソッドをそのまま使えます。必要な部分だけ、同じ名前のメソッドを定義して上書きできます。継承は便利ですが、深くしすぎると複雑になるため、最初は「共通処理をまとめる程度」に留めるのがおすすめです。
8. クラス用語 早見表
| 用語 | 意味 |
|---|---|
| クラス | 設計図(classで定義) |
| インスタンス | 設計図から作った実体(Dog("ポチ", 3)) |
| __init__ | インスタンス作成時に自動で呼ばれる初期化メソッド |
| self | そのインスタンス自身 |
| 属性 | インスタンスが持つデータ(self.name) |
| メソッド | クラスの中で定義された関数 |
| 継承 | 他のクラスの機能を引き継ぐこと |
9. まとめ
- クラスはデータと処理をまとめた設計図。そこからインスタンスを作って使う
__init__で初期化、selfでそのインスタンス自身を指す- 属性=インスタンスのデータ、メソッド=クラス内の関数
- 小さな処理は関数で十分。状態を持つ「モノ」を表したいときにクラス
- 継承で共通処理をまとめられる
👉 まずは__init__で属性を2〜3個持ち、メソッドを1つ作る、という小さなクラスから書いてみましょう。DjangoやFlaskなど、この先のフレームワークではクラスが当たり前に登場するので、ここで基本をつかんでおくと後がスムーズです。