<一覧に戻る

アクセサメソッド(ゲッター・セッター)

オブジェクト指向プログラミング(OOP)において、アクセサメソッド(ゲッター・セッター)は、オブジェクトの属性(データ)へのアクセスと変更を制御するためのメソッドです。これにより、属性への不正なアクセスや変更を防ぎ、データの一貫性と安全性を保つことができます。このセクションでは、Pythonを用いてアクセサメソッドの基本的な使い方と実装方法を初心者にもわかりやすく解説します。

ゲッターとセッターとは?

  • ゲッター(Getter): オブジェクトの属性の値を取得するためのメソッド。
  • セッター(Setter): オブジェクトの属性の値を設定(変更)するためのメソッド。

これらのメソッドを使用することで、属性への直接アクセスを避け、必要に応じて値の検証や加工を行うことができます。

なぜゲッター・セッターを使うのか?

  • データの保護: 属性への直接アクセスを制限し、不正な値の設定を防ぐ。
  • 一貫性の確保: 属性の値を設定する際に必要な検証や加工を行う。
  • 柔軟性の向上: 属性の内部実装を変更しても、外部のインターフェースを維持できる。

Pythonでのゲッター・セッターの実装方法

1. 直接メソッドを定義する方法

まず、基本的なゲッター・セッターメソッドを手動で定義する方法を見てみましょう。

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("年齢は正の整数でなければなりません。")

2. 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("年齢は正の整数でなければなりません。")

3. サンプルコードの実行例

以下に、上記の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 プロパティを通じて残高を安全に操作します。

まとめ

  • アクセサメソッド(ゲッター・セッター)は、オブジェクトの属性へのアクセスと変更を制御するための重要な手法です。
  • Pythonでは、@property デコレーターを使用することで、ゲッター・セッターメソッドを簡潔に定義できます。
  • アクセサメソッドを使用することで、データの保護や一貫性の確保、柔軟性の向上が可能になります。
  • 実際にコードを書いてゲッター・セッターを実装し、属性への安全なアクセス方法を理解することが重要です。

参考資料

出力結果: