Python 3におけるgetterとsetterの使い方
Pythonでは、クラスの属性に対して直接アクセスするのではなく、getterとsetterを使用して属性にアクセスすることが推奨されています。これにより、属性にアクセスする際に追加の処理を行ったり、属性の値を制限したりすることができます。Pythonらしい方法として、プロパティデコレータを使用する方法があります。
プロパティデコレータを使用したgetterとsetterの例
class Circle: def __init__(self, radius): self._radius = radius @property def radius(self): return self._radius @radius.setter def radius(self, value): if value < 0: raise ValueError("Radius cannot be negative") self._radius = value # インスタンスを作成してgetterとsetterを使用 c = Circle(5) print(c.radius) # 出力: 5 c.radius = 10 print(c.radius) # 出力: 10
上記の例では、Circleクラスにradius属性を持たせて、@propertyデコレータを使ってgetterメソッドを定義し、@radius.setterデコレータを使ってsetterメソッドを定義しています。radius属性にアクセスする際には、実際にはradiusメソッドが呼び出されるため、追加の処理を挟むことができます。
プロパティを使った計算された属性の例
class Rectangle: def __init__(self, width, height): self._width = width self._height = height @property def area(self): return self._width * self._height # インスタンスを作成して計算された属性を取得 r = Rectangle(4, 5) print(r.area) # 出力: 20
上記の例では、Rectangleクラスにarea属性を持たせて、@propertyデコレータを使ってgetterメソッドを定義しています。area属性はwidthとheightの積を返す計算された属性となっています。
プロパティを使った属性の制限の例
class Temperature: def __init__(self, celsius): self._celsius = celsius @property def celsius(self): return self._celsius @celsius.setter def celsius(self, value): if value < -273.15: raise ValueError("Temperature cannot be below absolute zero") self._celsius = value # インスタンスを作成して属性の制限を確認 temp = Temperature(25) print(temp.celsius) # 出力: 25 temp.celsius = -300 # ValueError: Temperature cannot be below absolute zero
上記の例では、Temperatureクラスにcelsius属性を持たせて、@propertyデコレータを使ってgetterメソッドとsetterメソッドを定義しています。setterメソッドでは、値が絶対零度未満にならないように制限をかけています。
Python 3では、getterとsetterを使ってクラスの属性にアクセスする方法があります。Pythonらしい方法としては、プロパティ(property)を使うことが推奨されています。
getterとsetterを定義する代わりに、@propertyデコレータを使って属性にアクセスするためのgetterメソッドを定義し、@property_name.setterデコレータを使ってsetterメソッドを定義します。これにより、属性に直接アクセスする代わりに、getterとsetterメソッドを介して属性にアクセスできるようになります。
例えば、以下のようにクラス内でプロパティを定義することができます:
class MyClass:
def __init__(self):
self._my_property = None@property
def my_property(self):
return self._my_property@my_property.setter
def my_property(self, value):
self._my_property = valueこのようにすることで、my_property属性に対してgetterとsetterを定義し、Pythonらしい方法で属性にアクセスできるようになります。