【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
を使うと、より直感的なコードが書ける