オブジェクト指向プログラミング(OOP)において、アクセサメソッド(ゲッター・セッター)は、オブジェクトの属性(データ)へのアクセスと変更を制御するためのメソッドです。これにより、属性への不正なアクセスや変更を防ぎ、データの一貫性と安全性を保つことができます。このセクションでは、Pythonを用いてアクセサメソッドの基本的な使い方と実装方法を初心者にもわかりやすく解説します。
これらのメソッドを使用することで、属性への直接アクセスを避け、必要に応じて値の検証や加工を行うことができます。
まず、基本的なゲッター・セッターメソッドを手動で定義する方法を見てみましょう。
class Person:
def __init__(self, name, age):
self._name = name # プロテクテッド属性
self._age = age # プロテクテッド属性
# ゲッター
def get_name(self):
return self._name
# セッター
def set_name(self, name):
if isinstance(name, str):
self._name = name
else:
print("名前は文字列でなければなりません。")
# ゲッター
def get_age(self):
return self._age
# セッター
def set_age(self, age):
if isinstance(age, int) and age >= 0:
self._age = age
else:
print("年齢は正の整数でなければなりません。")
property
デコレーターを使用する方法Pythonでは、property
デコレーターを使用してゲッター・セッターを簡潔に定義することができます。これにより、属性に直接アクセスしているような感覚でメソッドを呼び出すことができます。
class Person:
def __init__(self, name, age):
self._name = name # プロテクテッド属性
self._age = age # プロテクテッド属性
# ゲッター
@property
def name(self):
return self._name
# セッター
@name.setter
def name(self, name):
if isinstance(name, str):
self._name = name
else:
print("名前は文字列でなければなりません。")
# ゲッター
@property
def age(self):
return self._age
# セッター
@age.setter
def age(self, age):
if isinstance(age, int) and age >= 0:
self._age = age
else:
print("年齢は正の整数でなければなりません。")
以下に、上記のPerson
クラスを使用した例を示します。
# Personクラスのインスタンスを生成
person = Person("太郎", 25)
# ゲッターを使って属性にアクセス
print(person.name) # 出力: 太郎
print(person.age) # 出力: 25
# セッターを使って属性を変更
person.name = "花子"
person.age = 30
print(person.name) # 出力: 花子
print(person.age) # 出力: 30
# 不正な値の設定を試みる
person.name = 123 # 出力: 名前は文字列でなければなりません。
person.age = -5 # 出力: 年齢は正の整数でなければなりません。
@property
デコレーターを使用してゲッターメソッドを定義します。これにより、属性にアクセスする際に自動的にゲッターメソッドが呼び出されます。@<属性名>.setter
デコレーターを使用してセッターメソッドを定義します。これにより、属性に値を設定する際にセッターメソッドが呼び出されます。
属性へのアクセス:
ここでは、銀行口座を表すBankAccount
クラスを作成し、アクセサメソッドを使用して残高を安全に管理する例を見てみましょう。
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner # パブリック属性
self.__balance = balance # プライベート属性
# ゲッター
@property
def balance(self):
return self.__balance
# セッター
@balance.setter
def balance(self, amount):
if amount >= 0:
self.__balance = amount
else:
print("残高は正の数でなければなりません。")
def deposit(self, amount):
if amount > 0:
self.balance += amount
print(f"{amount}円を入金しました。現在の残高は{self.balance}円です。")
else:
print("入金額は正の数でなければなりません。")
def withdraw(self, amount):
if 0 < amount <= self.balance:
self.balance -= amount
print(f"{amount}円を引き出しました。現在の残高は{self.balance}円です。")
else:
print("引き出し額が不正です。")
# BankAccountクラスのインスタンスを生成
account = BankAccount("佐藤", 10000)
# ゲッターを使って残高にアクセス
print(account.balance) # 出力: 10000
# セッターを使って残高を変更
account.balance = 15000
print(account.balance) # 出力: 15000
# 不正な値の設定を試みる
account.balance = -5000 # 出力: 残高は正の数でなければなりません。
# メソッドを使った入金と引き出し
account.deposit(5000) # 出力: 5000円を入金しました。現在の残高は20000円です。
account.withdraw(3000) # 出力: 3000円を引き出しました。現在の残高は17000円です。
account.withdraw(20000) # 出力: 引き出し額が不正です。
__balance
:アンダースコア2つで始まる属性名により、名前マングリングが行われ、クラス外からの直接アクセスが制限されます。
ゲッター・セッター:
balance
プロパティを通じて、残高へのアクセスと変更を制御します。セッター内で、残高が正の数であることを確認し、不正な値の設定を防ぎます。
入金・引き出しメソッド:
deposit
メソッドと withdraw
メソッドは、balance
プロパティを通じて残高を安全に操作します。@property
デコレーターを使用することで、ゲッター・セッターメソッドを簡潔に定義できます。