Skip to content

Latest commit

 

History

History
75 lines (52 loc) · 2.33 KB

File metadata and controls

75 lines (52 loc) · 2.33 KB

プロパティと属性の違い、setter/getterを使う理由

1. 属性(Attribute)とは

  • クラスやオブジェクトに直接結びつくデータ(変数)のこと。
  • 例えば、obj.xx が属性。
  • 直接アクセスできるため、書き換えや参照が簡単。
class Sample:
    def __init__(self):
        self.x = 10  # 属性

obj = Sample()
print(obj.x)  # 10
obj.x = 20
print(obj.x)  # 20

2. プロパティ(Property)とは

  • 属性の値にアクセスするときの「処理(getter/setter)」をカプセル化したもの。
  • 直接アクセスはできるが、アクセス時に自動でメソッドが呼ばれる。
  • Pythonでは @property デコレータで実装する。
class Sample:
    def __init__(self):
        self._x = 10  # 実際の値は「_x」に格納

    @property
    def x(self):
        print("getterが呼ばれた")
        return self._x

    @x.setter
    def x(self, value):
        print("setterが呼ばれた")
        if value < 0:
            raise ValueError("xは0以上でなければならない")
        self._x = value

obj = Sample()
print(obj.x)  # getterが呼ばれた -> 10
obj.x = 20   # setterが呼ばれた
print(obj.x)  # getterが呼ばれた -> 20

3. なぜsetter/getter(プロパティ)を使うのか?

3-1. データの検証・制御ができる

  • 直接属性にアクセスすると不正な値も入ってしまう可能性がある。
  • setterを使えば値の範囲チェックや型チェックができる。

3-2. 後から実装を変更してもコードの利用側に影響を与えない

  • 最初は単純な属性でも、後でgetter/setterを追加したくなることがある。
  • プロパティを使っておけば、コードを使う側はアクセス方法を変えずに済む。

3-3. ログ記録や副作用の実行ができる

  • 属性の読み書き時に処理を追加できる(例:ログ出力、キャッシュ更新など)。

3-4. カプセル化・オブジェクト指向設計に適している

  • 内部実装を隠してインターフェースだけ公開することで、設計がきれいになる。

4. 参考リンク