Pythonの@property
について理解しよう
Pythonのクラスで@property
デコレータを使うと、メソッドを属性のように使えるようになります。この記事では、プロパティの仕組みとその活用について説明します。
プロパティとは?
- プロパティとはメソッドをあたかも属性のように扱える仕組みのことです
プロパティの基本的な機能
- 計算や処理を実行して結果を返す:単に値を返すだけでなく、内部で計算や処理を行い、その結果を返すことができます
-
ゲッターとセッターで値を制御する:値の設定時に検証や制限を追加し、クラス内の状態を管理することができます
- ここでいうゲッターとは
@property
をつけたメソッドを指します - セッターとは
@property
をつけたメソッド名にセットするメソッドをいいます
- ここでいうゲッターとは
- セッターやプロパティでアクセスする変数名には通常
_(アンダースコア)
を一つつける慣習があります- これは外部から直接アクセスしてほしくないことを示すためです
以下に具体的な例を挙げてみます
class Rectangle:
def __init__(self, width, height):
self._width = width
self.height = height
@property # ゲッター
def width(self):
return self._width
@width.setter # セッター
def width(self, val):
if val <= 0:
raise ValueError("Width must be positive")
self._width = val
@property # ゲッター
def area(self):
return self._width * self.height
このようなRectangleクラスを定義したときにゲッターは以下のようにして使うことができます。
使用例
rect = Rectangle(3,4)
print(rect.width) # 3
print(rect.area) # 12
rect.width = 6 #セッター
print(rect.area) # 24
このように、@property
と @<property_name>.setter
を組み合わせることで、値の設定時に制御を追加できます。
読み取り専用のプロパティ
@property
デコレータのみを使って、セッターを定義しなければ、プロパティは読み取り専用になります。以下の例ではwidth
は読み取り専用として機能し、外部からは値を変更できません。
以下に具体的な例を挙げてみます
class Rectangle2:
def __init__(self, width, height):
self.width = width
self.height = height
@property # ゲッター
def width(self):
return self.width
@property # ゲッター
def area(self):
return self.width * self.height
rec2 = Rectangle2(3,4)
rec2.width = 6 # この行はエラーになります :AttributeError: can't set attribute
プロパティのメリット
プロパティを使うことによって、次のようなメリットがあります。
- 柔軟なアクセス:計算結果や処理を外部から属性として取得することができる
- 値の検証:設定される値に制限や検証を加えることができる
- カプセル化の実現:内部の実装を隠しつつ、外部からはシンプルにアクセスできる
まとめ
プロパティを使うと、クラスの外部からメソッドを属性
のように扱え、柔軟に値を取得・設定することができます。Pythonのプロパティを活用して、シンプルな制御を実現してみてください。