カプセル化と情報隠蔽

@propertyデコレーターの使い方

さっき、ゲッターとセッターについて学んだよね。データを安全に管理するために便利だけど、ちょっとコードが長くなるなって思った人もいるかもしれないね。

そこで登場するのが、Pythonの「@propertyデコレーター」だよ!これは、ゲッターやセッターをもっとシンプルに、まるで普通の変数を使うみたいに扱えるようにしてくれる魔法の記号なんだ。

「デコレーター」っていうのは、関数やメソッドの上に書いて、その働きをちょっと変えたり、新しい機能を追加したりする特別なものだよ。「@」という記号から始まるのが特徴だね。

@propertyデコレーターを使うと、こんな風に書けるんだ。


class GameCharacter:
    def __init__(self, name):
        self.name = name
        self._hp = 100 # 体力は_hpとして内部で管理するよ

    # @propertyを使って、_hpのゲッターを作るよ!
    @property
    def hp(self):
        return self._hp

    # @hp.setterを使って、_hpのセッターを作るよ!
    # メソッド名はゲッターと同じ「hp」にするんだ
    @hp.setter
    def hp(self, new_hp):
        if new_hp < 0:
            self._hp = 0
            print("体力は0以下にはなりません!")
        elif new_hp > 100:
            self._hp = 100
            print("体力は最大値を超えません!")
        else:
            self._hp = new_hp

hero = GameCharacter("勇者")
print(f"{hero.name}の体力: {hero.hp}") # ゲッターを使う時も、まるで変数みたいに書ける!

hero.hp = 50 # セッターを使う時も、まるで変数みたいに書ける!
print(f"{hero.name}の体力: {hero.hp}")

hero.hp = -10 # セッターが動いて、ちゃんとチェックしてくれるよ
print(f"{hero.name}の体力: {hero.hp}")
# 出力:
# 勇者の体力: 100
# 勇者の体力: 50
# 体力は0以下にはなりません!
# 勇者の体力: 0

@propertyを付けたメソッドがゲッターになり、そのメソッド名に.setterを付けたデコレーター(例: @hp.setter)を、セッターのメソッドの上に付けるんだ。どちらのメソッドも同じ名前(ここではhpにするのがポイントだよ。

こうすることで、外からはhero.hpという普通の変数のように見えるけど、実はその裏で、ゲッターやセッターのメソッドが動いて、データの取得や設定を安全に行ってくれているんだ。

@propertyデコレーターは、Pythonらしいスマートな書き方で、カプセル化をより効果的にしてくれる、とても便利な機能だよ!