Pythonのプロパティについて
入門Python3 6.8
インスタンス変数に直接アクセスするのではなくゲッターやセッターを用意してそっちを使うっていうのは他の言語でもよくやりますね。
愚直に実装するなら以下のようになります。
class Foo(): def __init__(self,name): self.__name = name def get_name(self): return self.__name def set_name(self,name): self.__name = name foo = Foo("yamada") print(foo.get_name()) foo.set_name("satou") print(foo.get_name())
$ py main.py yamada satou
get_nameやset_nameを経由することで後から事前処理を入れたりできるのでインスタンス変数を直接アクセスするより仕様変更に強くなります。
でもとはいえやっぱり「foo.get_name()」や「foo.set_name("satou")」より「foo.name」や「foo.name="satou"」と書けた方が楽なんですよねぇ。
それを実現するのがPythonのプロパティです。
先ほどのクラスに一行追加します。
class Foo(): def __init__(self,name): self.__name = name def get_name(self): return self.__name def set_name(self,name): self.__name = name name = property(get_name,set_name) # コレを追加 foo = Foo("yamada") print(foo.name) foo.name = "satou" print(foo.name)
$ py main.py yamada satou
そしてpropertyはデコレータで書くこともできます。
ゲッターには@propertyを、セッターには@変数名.setterを定義します。
class Foo(): def __init__(self,name): self.__name = name @property def name(self): return self.__name @name.setter def name(self,name): self.__name = name foo = Foo("yamada") print(foo.name) foo.name = "satou" print(foo.name)
$ py main.py yamada satou
とっても便利ですね。すごい。