【Python】カプセル化とセッター・ゲッター【クラス】

【Python】カプセル化とセッター・ゲッター【クラス】

目次

カプセル化とは

カプセル化(Encapsulation)とは、オブジェクト指向プログラミングにおける重要な概念の一つで、データ(属性)を直接外部から操作できないようにし、メソッドを通じてのみアクセスできるようにする仕組みのことです。

Pythonでは、アンダースコア(_ または __)を使うことで属性をカプセル化できます。

カプセル化の目的

  • データの安全性を確保する
  • 外部からの不正なアクセスを防ぐ
  • オブジェクトの内部構造を隠蔽し、変更に強い設計をする

カプセル化の例

class Person:
    def __init__(self, name, age):
        self.name = name
        self.__age = age  # __をつけると外部からアクセスできなくなる

p = Person("Taro", 25)
print(p.name)   # OK
print(p.__age)  # エラー(AttributeError)

セッターとゲッターとは

カプセル化されたデータに対して、適切な方法で値を取得(ゲッター)し、更新(セッター)する仕組みを提供するのが、セッター(setter)とゲッター(getter)です。

ゲッター(Getter)

ゲッターは、カプセル化された変数の値を取得するためのメソッドです。

セッター(Setter)

セッターは、カプセル化された変数の値を設定するためのメソッドです。適切な値であるかのチェックを行うことができます。

基本的なセッター・ゲッターの実装

class Person:
    def __init__(self, name, age):
        self.name = name
        self.__age = age  # 非公開変数

    def get_age(self):
        return self.__age

    def set_age(self, age):
        if age >= 0:
            self.__age = age
        else:
            raise ValueError("年齢は0以上でなければなりません")

p = Person("Taro", 25)
print(p.get_age())  # 25
p.set_age(30)
print(p.get_age())  # 30
p.set_age(-5)  # ValueErrorが発生

プロパティ(@property)を使った方法

Pythonでは、@propertyデコレーターを使うことで、ゲッターとセッターをより直感的に書くことができます。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.__age = age

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, age):
        if age >= 0:
            self.__age = age
        else:
            raise ValueError("年齢は0以上でなければなりません")

p = Person("Taro", 25)
print(p.age)   # 25(ゲッターが呼ばれる)
p.age = 30     # セッターが呼ばれる
print(p.age)   # 30
p.age = -5     # ValueError

応用的なセッター・ゲッターの実装

より高度な使い方として、特定の処理を加えたり、キャッシュを使ったりすることも可能です。

データの変換を行うセッター・ゲッター

class Temperature:
    def __init__(self, celsius):
        self.celsius = celsius

    @property
    def fahrenheit(self):
        return self.celsius * 9/5 + 32

    @fahrenheit.setter
    def fahrenheit(self, value):
        self.celsius = (value - 32) * 5/9

temp = Temperature(25)
print(temp.fahrenheit)  # 77.0
temp.fahrenheit = 100
print(temp.celsius)     # 37.777...

セッター・ゲッターの活用例

データの入力チェック

class Account:
    def __init__(self, balance):
        self._balance = balance

    @property
    def balance(self):
        return self._balance

    @balance.setter
    def balance(self, amount):
        if amount >= 0:
            self._balance = amount
        else:
            raise ValueError("残高は負の値にはできません")

acc = Account(1000)
acc.balance = 500   # OK
print(acc.balance)  # 500
acc.balance = -200  # ValueError

まとめ

  • カプセル化はデータの安全性を確保するために重要
  • セッター・ゲッターを使うことで、安全にデータの操作が可能
  • @property を使うと、より直感的なコードが書ける

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です