🏗️ ステップ22: クラスの基礎
オブジェクト指向プログラミングの世界へようこそ!
今まで、関数を使ってプログラムを作ってきました。でも、大きなプログラムになると、データと機能を1つにまとめたくなります。それを実現するのがクラスです。
📖 このステップで学ぶこと
・オブジェクト指向とは何か
・クラスとインスタンスの違い
・__init__メソッドの使い方
・属性とメソッドの基礎
・__str__メソッドで文字列表現
🎯 1. オブジェクト指向って何?
🔰 クラスが必要な理由
例えば、「犬」を表すプログラムを考えてみましょう:
📌 「犬」を表現するには?
| 分類 | 内容 | 例 |
| データ(何を持っている?) | 犬の情報 | 名前、年齢、犬種 |
| 機能(何ができる?) | 犬の動作 | 鳴く、走る、寝る |
これらを1つにまとめたものがクラスです。
🔰 クラスとインスタンス
クラスは「設計図」、インスタンスは「実際に作られた物」です。
💡 設計図と実物のイメージ
・クラス(設計図):「犬」という概念
・インスタンス(実物):「ポチ」「タロ」という具体的な犬
1つの設計図から、何匹でも犬を作れます!
📝 2. 最もシンプルなクラス
📝 クラスの定義方法
📝 クラスの構文
class クラス名:
pass # 中身がない場合はpassを書く
・class:クラスを定義するキーワード
・クラス名:大文字で始めるのが慣例(例:Dog、Person、BankAccount)
完成コード:最もシンプルなクラス
※スマートフォンでは横スクロールできます
# class で新しいクラスを定義
# Dog はクラス名(大文字で始める)
class Dog:
pass # 中身がないクラス
# インスタンス(実物)を作成
# クラス名() で新しいインスタンスを作る
pochi = Dog()
taro = Dog()
# 別々のオブジェクトが作られている
print(pochi)
print(taro)
実行結果
<__main__.Dog object at 0x7f8b3c4d5e80> <__main__.Dog object at 0x7f8b3c4d5f40>
※アドレス(0x…の部分)は実行するたびに変わります
💡 ポイント
・pochiとtaroは別々のオブジェクト(アドレスが違う)
・同じ設計図(Dog)から、何個でもインスタンスを作れる
📦 3. 属性 – データを持たせる
属性(attribute)は、インスタンスが持つデータです。各インスタンスごとに異なる値を持てます。
📝 属性の設定と取得
完成コード:属性を後から追加
※スマートフォンでは横スクロールできます
class Dog:
pass
# インスタンスを作成
pochi = Dog()
# 属性を設定(ドット記法)
# インスタンス.属性名 = 値
pochi.name = "ポチ" # 名前を設定
pochi.age = 3 # 年齢を設定
# 属性を取得(ドット記法)
# インスタンス.属性名
print(f"名前: {pochi.name}")
print(f"年齢: {pochi.age}歳")
実行結果
名前: ポチ 年齢: 3歳
📝 複数のインスタンスで異なるデータ
それぞれのインスタンスは、独立したデータを持ちます。
完成コード:2匹の犬
※スマートフォンでは横スクロールできます
class Dog:
pass
# 2匹の犬を作成
pochi = Dog()
pochi.name = "ポチ"
pochi.age = 3
taro = Dog()
taro.name = "タロ"
taro.age = 5
# それぞれ独立したデータを持つ
print(f"{pochi.name}は{pochi.age}歳")
print(f"{taro.name}は{taro.age}歳")
実行結果
ポチは3歳 タロは5歳
📌 属性のまとめ
| 操作 | 書き方 | 例 |
| 属性を設定 | インスタンス.属性名 = 値 |
pochi.name = "ポチ" |
| 属性を取得 | インスタンス.属性名 |
print(pochi.name) |
🔧 4. __init__メソッド – 初期化
パート1では、インスタンスを作った後に属性を設定しました。でも、毎回手動で設定するのは面倒です。
__init__メソッドを使うと、インスタンスを作る時に自動的に初期値を設定できます。
🔰 __init__とは
📝 __init__メソッドの特徴
・インスタンスを作る時に自動的に呼ばれる特別なメソッド
・「イニット」と読む(initialize = 初期化)
・属性の初期値を設定するのに使う
・前後にアンダースコア2つ(__)が付く
📝 __init__の基本的な書き方
📝 __init__の構文
def __init__(self, 引数1, 引数2, ...):
self.属性名 = 引数
・self:自分自身を表す特別な変数(必ず第一引数に書く)
・引数で受け取った値を、self.属性名に設定する
完成コード:__init__で初期化
※スマートフォンでは横スクロールできます
class Dog:
# __init__ はインスタンス作成時に自動で呼ばれる
# self は「自分自身」を表す(必須)
# name と age は引数(インスタンス作成時に渡す)
def __init__(self, name, age):
# self.name は「このインスタンスのname属性」
self.name = name
# self.age は「このインスタンスのage属性」
self.age = age
# インスタンス作成時に引数を渡す
# Dog("ポチ", 3) → __init__(self, "ポチ", 3) が呼ばれる
pochi = Dog("ポチ", 3)
taro = Dog("タロ", 5)
print(f"{pochi.name}は{pochi.age}歳")
print(f"{taro.name}は{taro.age}歳")
実行結果
ポチは3歳 タロは5歳
🔰 selfって何?
selfは、そのインスタンス自身を指す特別な変数です。
📌 selfのイメージ
| 書き方 | 意味 |
self |
「このインスタンス自身」 |
self.name |
「このインスタンスのname属性」 |
self.age |
「このインスタンスのage属性」 |
図解:selfの動作
※スマートフォンでは横スクロールできます
# pochi = Dog("ポチ", 3) を実行すると...
# 1. 新しいDogインスタンスが作られる
# 2. __init__(self, "ポチ", 3) が呼ばれる
# この時、self = 新しく作られたインスタンス
# 3. self.name = "ポチ" → pochiのname属性に"ポチ"が入る
# 4. self.age = 3 → pochiのage属性に3が入る
# 5. pochiにインスタンスが代入される
💡 selfのポイント
・pochiとtaroは別々のselfを持っている
・pochi.nameとtaro.nameは別のデータ
・selfは必ず第一引数に書くが、呼び出し時は書かない
📝 デフォルト値を設定する
引数にデフォルト値を設定することもできます。
完成コード:デフォルト値付き__init__
※スマートフォンでは横スクロールできます
class Dog:
# age=0 はデフォルト値(指定しなければ0になる)
def __init__(self, name, age=0):
self.name = name
self.age = age
# 年齢を指定
pochi = Dog("ポチ", 3)
# 年齢を省略(デフォルト値の0になる)
puppy = Dog("子犬")
print(f"{pochi.name}は{pochi.age}歳")
print(f"{puppy.name}は{puppy.age}歳")
実行結果
ポチは3歳 子犬は0歳
📝 __init__で複数の属性を初期化
完成コード:複数の属性を初期化
※スマートフォンでは横スクロールできます
class Dog:
def __init__(self, name, age, breed):
self.name = name # 名前
self.age = age # 年齢
self.breed = breed # 犬種
self.energy = 100 # 元気度(固定の初期値)
pochi = Dog("ポチ", 3, "柴犬")
print(f"名前: {pochi.name}")
print(f"年齢: {pochi.age}歳")
print(f"犬種: {pochi.breed}")
print(f"元気度: {pochi.energy}")
実行結果
名前: ポチ 年齢: 3歳 犬種: 柴犬 元気度: 100
💡 __init__のポイント
・引数から受け取った値を設定(name, age, breed)
・固定の初期値も設定できる(energy = 100)
・リストや辞書なども属性として持てる(次のパートで紹介)
⚡ 5. メソッド – 機能を持たせる
メソッドは、クラスが持つ関数です。インスタンスの動作を定義します。
🔰 メソッドとは
📌 関数とメソッドの違い
| 種類 | 説明 | 呼び出し方 |
| 関数 | 独立した処理 | 関数名() |
| メソッド | クラスに属する処理 | インスタンス.メソッド名() |
📝 基本的なメソッドの書き方
📝 メソッドの構文
def メソッド名(self):
# 処理
・メソッドの第一引数は必ずself
・self.属性名で、そのインスタンスの属性にアクセスできる
完成コード:基本的なメソッド
※スマートフォンでは横スクロールできます
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
# メソッドの定義(第一引数は必ずself)
def bark(self):
# self.name でこのインスタンスの名前にアクセス
print(f"{self.name}: ワンワン!")
def run(self):
print(f"{self.name}は走っています")
# インスタンスを作成
pochi = Dog("ポチ", 3)
# メソッドを呼び出す(selfは書かない)
pochi.bark()
pochi.run()
実行結果
ポチ: ワンワン! ポチは走っています
💡 メソッド呼び出しのポイント
・定義時はdef bark(self):とselfを書く
・呼び出し時はpochi.bark()とselfは書かない
・Pythonが自動的にselfにpochiを渡してくれる
📝 属性を変更するメソッド
メソッドの中で、属性の値を変更することもできます。
完成コード:属性を変更するメソッド
※スマートフォンでは横スクロールできます
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print(f"僕は{self.name}、{self.age}歳だよ!")
def birthday(self):
# self.age を1増やす
self.age += 1
print(f"{self.name}は{self.age}歳になりました!")
pochi = Dog("ポチ", 3)
pochi.introduce() # 3歳
pochi.birthday() # 誕生日で4歳に
pochi.introduce() # 4歳になっている
実行結果
僕はポチ、3歳だよ! ポチは4歳になりました! 僕はポチ、4歳だよ!
📝 引数を受け取るメソッド
selfの後に、追加の引数を受け取ることもできます。
完成コード:引数を受け取るメソッド
※スマートフォンでは横スクロールできます
class Dog:
def __init__(self, name):
self.name = name
self.energy = 100 # 元気度
def play(self, minutes):
# minutes 分遊ぶと元気度が減る
self.energy -= minutes * 2
print(f"{self.name}は{minutes}分遊びました")
print(f"元気度: {self.energy}")
def rest(self, minutes):
# minutes 分休むと元気度が回復
self.energy += minutes * 3
if self.energy > 100:
self.energy = 100
print(f"{self.name}は{minutes}分休みました")
print(f"元気度: {self.energy}")
pochi = Dog("ポチ")
pochi.play(10) # 10分遊ぶ
pochi.play(20) # 20分遊ぶ
pochi.rest(10) # 10分休む
実行結果
ポチは10分遊びました 元気度: 80 ポチは20分遊びました 元気度: 40 ポチは10分休みました 元気度: 70
📝 値を返すメソッド
メソッドはreturnで値を返すこともできます。
完成コード:値を返すメソッド
※スマートフォンでは横スクロールできます
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def get_human_age(self):
# 犬の年齢を人間の年齢に換算して返す
return self.age * 7
def is_adult(self):
# 3歳以上なら成犬(Trueを返す)
return self.age >= 3
pochi = Dog("ポチ", 5)
human_age = pochi.get_human_age()
print(f"{pochi.name}は人間でいうと{human_age}歳")
if pochi.is_adult():
print(f"{pochi.name}は成犬です")
else:
print(f"{pochi.name}はまだ子犬です")
実行結果
ポチは人間でいうと35歳 ポチは成犬です
📌 メソッドの種類まとめ
| 種類 | 特徴 | 例 |
| 表示系 | 情報を表示する | introduce() |
| 変更系 | 属性を変更する | birthday() |
| 計算系 | 値を計算して返す | get_human_age() |
| 判定系 | True/Falseを返す | is_adult() |
🎯 6. 実践的な例
ここまで学んだことを使って、実際に役立つクラスを作ってみましょう。
📝 実践例1:銀行口座クラス
入金・出金・残高確認ができる銀行口座を作ります。
完成コード:BankAccountクラス
※スマートフォンでは横スクロールできます
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner # 口座名義人
self.balance = balance # 残高(デフォルト0円)
def deposit(self, amount):
"""入金"""
self.balance += amount
print(f"{amount}円を入金しました")
print(f"残高: {self.balance}円")
def withdraw(self, amount):
"""出金"""
if amount > self.balance:
print("残高不足です")
else:
self.balance -= amount
print(f"{amount}円を引き出しました")
print(f"残高: {self.balance}円")
def show_balance(self):
"""残高表示"""
print(f"{self.owner}さんの残高: {self.balance}円")
# 口座を作成(初期残高10000円)
account = BankAccount("太郎", 10000)
# 操作
account.show_balance()
account.deposit(5000)
account.withdraw(3000)
account.withdraw(20000) # 残高不足
実行結果
太郎さんの残高: 10000円 5000円を入金しました 残高: 15000円 3000円を引き出しました 残高: 12000円 残高不足です
📝 実践例2:生徒クラス
テストの点数を記録して平均点を計算する生徒クラスを作ります。
完成コード:Studentクラス
※スマートフォンでは横スクロールできます
class Student:
def __init__(self, name, grade):
self.name = name # 名前
self.grade = grade # 学年
self.scores = [] # テストの点数リスト(空のリストで初期化)
def add_score(self, score):
"""点数を追加"""
self.scores.append(score)
print(f"{self.name}の点数を追加: {score}点")
def get_average(self):
"""平均点を計算"""
if len(self.scores) == 0:
return 0
return sum(self.scores) / len(self.scores)
def show_report(self):
"""成績表を表示"""
print(f"=== {self.name}({self.grade}年生) ===")
print(f"テスト回数: {len(self.scores)}回")
print(f"点数一覧: {self.scores}")
print(f"平均点: {self.get_average():.1f}点")
# 生徒を作成
student = Student("太郎", 2)
# 点数を追加
student.add_score(85)
student.add_score(92)
student.add_score(78)
# 成績表を表示
student.show_report()
実行結果
太郎の点数を追加: 85点 太郎の点数を追加: 92点 太郎の点数を追加: 78点 === 太郎(2年生) === テスト回数: 3回 点数一覧: [85, 92, 78] 平均点: 85.0点
📝 実践例3:カウンタークラス
シンプルなカウンターを作ります。
完成コード:Counterクラス
※スマートフォンでは横スクロールできます
class Counter:
def __init__(self, start=0):
self.count = start # 初期値(デフォルト0)
def increment(self):
"""1増やす"""
self.count += 1
def decrement(self):
"""1減らす"""
self.count -= 1
def reset(self):
"""0にリセット"""
self.count = 0
def get_count(self):
"""現在の値を返す"""
return self.count
# 初期値10でカウンター作成
counter = Counter(10)
print(f"初期値: {counter.get_count()}")
counter.increment()
counter.increment()
print(f"2回増やした: {counter.get_count()}")
counter.decrement()
print(f"1回減らした: {counter.get_count()}")
counter.reset()
print(f"リセット: {counter.get_count()}")
実行結果
初期値: 10 2回増やした: 12 1回減らした: 11 リセット: 0
📝 実践例4:ショッピングカートクラス
商品を追加して合計金額を計算するカートを作ります。
完成コード:ShoppingCartクラス
※スマートフォンでは横スクロールできます
class ShoppingCart:
def __init__(self):
self.items = [] # 商品リスト(辞書のリスト)
def add_item(self, name, price, quantity=1):
"""商品を追加"""
item = {
"name": name,
"price": price,
"quantity": quantity
}
self.items.append(item)
print(f"{name}を{quantity}個追加しました")
def get_total(self):
"""合計金額を計算"""
total = 0
for item in self.items:
total += item["price"] * item["quantity"]
return total
def show_cart(self):
"""カートの中身を表示"""
print("=== カートの中身 ===")
for item in self.items:
subtotal = item["price"] * item["quantity"]
print(f"{item['name']}: {item['price']}円 × {item['quantity']}個 = {subtotal}円")
print(f"合計: {self.get_total()}円")
# カートを作成
cart = ShoppingCart()
# 商品を追加
cart.add_item("りんご", 150, 3)
cart.add_item("バナナ", 200, 2)
cart.add_item("牛乳", 250)
# カートを表示
cart.show_cart()
実行結果
りんごを3個追加しました バナナを2個追加しました 牛乳を1個追加しました === カートの中身 === りんご: 150円 × 3個 = 450円 バナナ: 200円 × 2個 = 400円 牛乳: 250円 × 1個 = 250円 合計: 1100円
💡 実践例のポイント
・属性にリストや辞書も使える(scores、items)
・メソッド内で他のメソッドを呼び出せる(show_report内でget_average)
・条件分岐でエラー処理ができる(残高不足チェック)
🔤 7. __str__メソッド – 文字列表現
__str__メソッドを定義すると、print()でインスタンスを表示した時の文字列をカスタマイズできます。
🔰 __str__がない場合
※スマートフォンでは横スクロールできます
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
pochi = Dog("ポチ", 3)
print(pochi) # わかりにくい表示...
実行結果
<__main__.Dog object at 0x7f8b3c4d5e80>
📝 __str__を定義する
完成コード:__str__で見やすい表示
※スマートフォンでは横スクロールできます
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
# print() で表示される文字列を返す
return f"Dog(名前: {self.name}, 年齢: {self.age}歳)"
pochi = Dog("ポチ", 3)
print(pochi) # __str__ の戻り値が表示される
実行結果
Dog(名前: ポチ, 年齢: 3歳)
📝 __str__の構文
def __str__(self):
return "表示したい文字列"
・必ず文字列を返す
・print()やstr()で自動的に呼ばれる
📝 実用例:商品クラス
完成コード:Productクラス
※スマートフォンでは横スクロールできます
class Product:
def __init__(self, name, price, stock):
self.name = name # 商品名
self.price = price # 価格
self.stock = stock # 在庫数
def __str__(self):
return f"{self.name}: {self.price}円 (在庫: {self.stock}個)"
# 商品リストを作成
products = [
Product("りんご", 150, 50),
Product("バナナ", 200, 30),
Product("オレンジ", 180, 40)
]
# print() で簡単に表示できる
print("=== 商品一覧 ===")
for product in products:
print(product)
実行結果
=== 商品一覧 === りんご: 150円 (在庫: 50個) バナナ: 200円 (在庫: 30個) オレンジ: 180円 (在庫: 40個)
📝 練習問題(10問)
ここまで学んだことを実際に手を動かして確認しましょう。
問題1:シンプルなPersonクラス(初級)
📋 問題
名前と年齢を持つPersonクラスを作り、自己紹介するメソッドを追加しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
print(f"私は{self.name}、{self.age}歳です")
person = Person("太郎", 15)
person.introduce()
問題2:Rectangleクラス(初級)
📋 問題
幅と高さを持つRectangleクラスを作り、面積を返すメソッドを追加しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
def perimeter(self):
return (self.width + self.height) * 2
rect = Rectangle(5, 10)
print(f"面積: {rect.area()}")
print(f"周囲: {rect.perimeter()}")
問題3:Carクラス(初級)
📋 問題
車の名前と速度を持つCarクラスを作り、加速・減速するメソッドを追加しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
class Car:
def __init__(self, name):
self.name = name
self.speed = 0
def accelerate(self, amount):
self.speed += amount
print(f"{self.name}が加速! 速度: {self.speed}km/h")
def brake(self, amount):
self.speed -= amount
if self.speed < 0:
self.speed = 0
print(f"{self.name}が減速! 速度: {self.speed}km/h")
car = Car("マイカー")
car.accelerate(50)
car.accelerate(30)
car.brake(20)
問題4:Circleクラス(中級)
📋 問題
半径を持つCircleクラスを作り、面積と円周を計算するメソッドを追加しましょう。(円周率は3.14)
解答を見る
コード
※スマートフォンでは横スクロールできます
class Circle:
def __init__(self, radius):
self.radius = radius
self.pi = 3.14
def area(self):
return self.pi * self.radius ** 2
def circumference(self):
return 2 * self.pi * self.radius
circle = Circle(5)
print(f"半径: {circle.radius}")
print(f"面積: {circle.area()}")
print(f"円周: {circle.circumference()}")
問題5:Bookクラス(中級)
📋 問題
タイトル、著者、ページ数を持つBookクラスを作り、__str__メソッドを追加しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
class Book:
def __init__(self, title, author, pages):
self.title = title
self.author = author
self.pages = pages
def __str__(self):
return f"『{self.title}』{self.author}著 ({self.pages}ページ)"
book = Book("Pythonの教科書", "山田太郎", 350)
print(book)
問題6:温度変換クラス(中級)
📋 問題
摂氏温度を持つTemperatureクラスを作り、華氏に変換するメソッドを追加しましょう。(華氏 = 摂氏 × 1.8 + 32)
解答を見る
コード
※スマートフォンでは横スクロールできます
class Temperature:
def __init__(self, celsius):
self.celsius = celsius
def to_fahrenheit(self):
return self.celsius * 1.8 + 32
def display(self):
print(f"{self.celsius}℃ = {self.to_fahrenheit()}℉")
temp = Temperature(25)
temp.display()
temp2 = Temperature(0)
temp2.display()
問題7:タイマークラス(中級)
📋 問題
秒数を管理するTimerクラスを作り、時:分:秒の形式で表示するメソッドを追加しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
class Timer:
def __init__(self, seconds=0):
self.seconds = seconds
def add_seconds(self, sec):
self.seconds += sec
def display(self):
hours = self.seconds // 3600
minutes = (self.seconds % 3600) // 60
secs = self.seconds % 60
print(f"{hours:02d}:{minutes:02d}:{secs:02d}")
timer = Timer()
timer.add_seconds(3665) # 1時間1分5秒
timer.display()
問題8:RPGキャラクタークラス(上級)
📋 問題
名前、HP、攻撃力を持つCharacterクラスを作り、攻撃・ダメージを受ける・回復するメソッドを追加しましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
class Character:
def __init__(self, name, hp, attack):
self.name = name
self.hp = hp
self.max_hp = hp
self.attack = attack
def attack_enemy(self, enemy):
print(f"{self.name}の攻撃!")
enemy.take_damage(self.attack)
def take_damage(self, damage):
self.hp -= damage
if self.hp < 0:
self.hp = 0
print(f"{self.name}は{damage}のダメージ! HP: {self.hp}/{self.max_hp}")
def heal(self, amount):
self.hp += amount
if self.hp > self.max_hp:
self.hp = self.max_hp
print(f"{self.name}は{amount}回復! HP: {self.hp}/{self.max_hp}")
hero = Character("勇者", 100, 20)
enemy = Character("スライム", 50, 10)
hero.attack_enemy(enemy)
enemy.attack_enemy(hero)
hero.heal(15)
問題9:ToDoリストクラス(上級)
📋 問題
タスクを追加・完了・表示できるToDoListクラスを作りましょう。
解答を見る
コード
※スマートフォンでは横スクロールできます
class ToDoList:
def __init__(self):
self.tasks = []
def add_task(self, task):
self.tasks.append({"task": task, "done": False})
print(f"タスクを追加: {task}")
def complete_task(self, index):
if 0 <= index < len(self.tasks):
self.tasks[index]["done"] = True
print(f"完了: {self.tasks[index]['task']}")
def show_tasks(self):
print("=== ToDoリスト ===")
for i, item in enumerate(self.tasks):
status = "✓" if item["done"] else " "
print(f"{i}. [{status}] {item['task']}")
todo = ToDoList()
todo.add_task("買い物")
todo.add_task("宿題")
todo.add_task("掃除")
todo.complete_task(0)
todo.show_tasks()
問題10:日付クラス(上級)
📋 問題
年、月、日を持つDateクラスを作り、次の日に進めるメソッドと__str__メソッドを追加しましょう。(簡易版:月の日数は30日固定でOK)
解答を見る
コード
※スマートフォンでは横スクロールできます
class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
def next_day(self):
self.day += 1
if self.day > 30: # 簡易版
self.day = 1
self.month += 1
if self.month > 12:
self.month = 1
self.year += 1
def __str__(self):
return f"{self.year}年{self.month}月{self.day}日"
date = Date(2024, 12, 30)
print(date)
date.next_day()
print(date)
date.next_day()
print(date)
❓ よくある質問
Q1: クラスと関数はどう違う?
・関数:「処理」だけを持つ
・クラス:「データ(属性)」と「処理(メソッド)」の両方を持つ
関連するデータと機能をまとめられるのがクラスの強みです。
Q2: selfは必ず書かないとダメ?
はい、メソッドの第一引数には必ずselfを書きます。Pythonの決まりです。
ただし、メソッドを呼び出す時は書きません。
定義時:def bark(self):
呼び出し時:pochi.bark()
Q3: __init__は必須?
必須ではありませんが、ほとんどのクラスで使います。
初期値を設定するのに便利だからです。
__init__がないクラスは、後から属性を追加することになります。
Q4: クラス名は何でもいい?
慣例として、クラス名は大文字で始める(例:Dog, BankAccount)
変数名や関数名は小文字で始めるので、区別しやすくなります。
複数の単語の場合は、単語ごとに大文字(例:ShoppingCart)
Q5: いつクラスを使うべき?
以下のような時にクラスが便利です:
・関連するデータと機能をまとめたい時
・同じような処理を複数のオブジェクトで使いたい時
・データの状態を保持したい時
最初は無理に使わなくてもOK。慣れてきたら使ってみましょう。
📌 クラスの用語まとめ
| 用語 | 説明 | 例 |
| クラス | 設計図 | class Dog: |
| インスタンス | クラスから作った実物 | pochi = Dog() |
| 属性 | インスタンスのデータ | self.name |
| メソッド | クラスに属する関数 | def bark(self): |
| self | インスタンス自身を指す | self.name = name |
| __init__ | 初期化メソッド | def __init__(self, name): |
| __str__ | 文字列表現メソッド | def __str__(self): |
🎉 ステップ22のまとめ
✅ このステップで学んだこと
✓ クラスは設計図、インスタンスは実物
✓ 属性でデータを、メソッドで機能を持たせる
✓ __init__でインスタンス作成時に初期化
✓ selfは「このインスタンス自身」を表す
✓ __str__でprint()時の表示をカスタマイズ
✓ 関連するデータと機能を1つにまとめられる
📌 クラスを作る手順
| 手順 | やること |
| 1. クラス定義 | class クラス名: |
| 2. __init__で初期化 | 属性の初期値を設定 |
| 3. メソッドを追加 | 必要な機能を実装 |
| 4. __str__を追加(任意) | 見やすい表示を設定 |
| 5. インスタンス作成 | 変数 = クラス名(引数) |
💪 次のステップへ
クラスの基礎をマスターしました!
これで、データと機能を1つにまとめた「オブジェクト」を作れるようになりました。
次のステップでは、「クラスの活用」を学びます。
継承、クラス変数、カプセル化など、より高度な機能を身につけましょう!
学習メモ
Pythonプログラミング基礎 - Step 22