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


とっても便利ですね。すごい。