説明
クラスインスタンスの内部変数の公開
デコレータ「@property」を使う
Pythonでクラスを実装するとき
内部変数を公開するために
JavaやVBのように
セッターゲッターメソッドを書きたくなる。
Pythonは内部変数とはいえ
公開されているものなので
セッターゲッターメソッドを書く必要はないのだが
クラスの意思を表現する意味にはなる、と思う。
だが、Pythonには、内部変数を公開する
もっといい方法「プロパティ」がある。
プロパティを使う方法はいくつかあるが
ぼくは、デコレータを使う方法で実装している。
こんな感じ。
フルーツのクラス
フルーツのクラスは色プロパティを持っている。
class Fruit(): def __init__(self, color): self.__color = color @property def color(self): return self.__color @color.setter def color(self, color): self.__color = color
インスタンス生成時に、フルーツの色を与えると
colorプロパティで参照したり設定したりすることが出来る。
こんな感じ。
apple = Fruit('red') print(apple.color) apple.color = 'yellow' print(apple.color)
(実行結果)
red
yellow
内部変数と公開するプロパティ名の関係に注意
例としたフルーツクラスのcolorプロパティの内部変数は
__color という名前にしている。
これをプロパティ名と同じ
color
という名前にすると、うまくいかない。
内部で再帰呼び出しが発生して
例外で落ちてしまうのだ。
この挙動を知らないと
ちゃんとコードを書いてるのに
うまくいかない、となるので注意。
そんなこともあるけれど
この方法は
ゲッターセッターメソッドで実装するよりも
とってもシンプル。
そしてデコレータ@propertyで
明確にプロパティだ!とわかるから
メンテナンスもしやすい。
Pythonバンザイ