全般

[Python] setterとgetterの使い方(具体例あり)

今回は、Pythonのsetterとgetterの使い方をご紹介します。

setterとgetterの概要

Pythonでsettergetterと呼ばれる仕組みは、クラス内の属性を外部から取得・変更する際に、中間処理を挟むための方法です。

多くの言語ではカプセル化を行うためにsetterやgetterを使用しますが、Pythonの場合、一般的に@propertyデコレータproperty()関数を利用することが多いです。

これらを活用することで、属性の変更時にバリデーション処理(値の検証など)や変換処理を行うことが可能になります。

Pythonにおけるsetterとgetterの実装方法

Pythonでは、以下の3つの方法でsetterとgetterを実装できます。

  • @propertyデコレータを使う方法
  • property()関数を使う方法
  • ディスクリプタを用いる高度な方法

ここでは、それぞれの実装例を紹介します。

@propertyデコレータによる実装

まずは@propertyデコレータを使った方法です。

このコードでは、内部属性に直接アクセスさせず、検証・変換のための処理を@propertyデコレータで提供しています。

実行結果

25
77.0

property()関数による実装

@propertyデコレータを使わず、組み込みのproperty()関数を利用することも可能です。

property()関数は、関数を引数に渡すスタイルのため、冗長に感じる場合があります。

実行結果

Alice

ディスクリプタを利用した高度な方法

より柔軟な実装を行いたい場合、ディスクリプタと呼ばれる仕組みを使うこともできます。

ディスクリプタを使うと、getterやsetterのロジックを一か所にまとめて、多くのクラスで再利用できます。

実行結果

100
200

よくあるエラーや注意点

setterやgetterを使う上で、以下の点に注意するとスムーズに実装できます。

  • 無限再帰の回避:setterやgetterの内部で、同じプロパティを呼び出さないようにする
  • 命名規則:内部属性にはアンダースコア付き(_value)の名前を使う
  • 必要以上の複雑化を避ける:単純な属性にはgetter/setterを使わず、後から必要になったらプロパティに切り替える
  • パフォーマンスの考慮:頻繁にアクセスする属性に複雑な処理を組み込むと、実行速度に影響が出る

まとめ

Pythonでは、setterやgetterを簡潔に実装する方法として@propertyデコレータやproperty()関数があります。

ディスクリプタを使えば、より柔軟で再利用性の高い実装が可能です。

カプセル化やバリデーションが必要な場合にこれらを活用すると、保守性の高いコードを書くことができます。