ステップ22:クラスの基礎

🏗️ ステップ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…の部分)は実行するたびに変わります

💡 ポイント

pochitaroは別々のオブジェクト(アドレスが違う)

・同じ設計図(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

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE