Python プロパティのgettter & setter

クラスのプロパティ getter / setter の定義は2通りある。
・@property デコレータの方法
・property関数の定義の方法

’@’が付くのを デコレータと呼ぶ? → Java に慣れしたんだ筆者はどうしても
アノテーションと呼んでしまいそうだ。
@property デコレータの方法

class User():
    def __init__(self, value=None):
        self.name = value
    @property
    def _name(self):
        return self._name
    @_name.setter
    def _name(self, value):
        self._name = value
    @_name.deleter
    def _name(self):
        del self._name

property関数の方法

class User():
    def __init__(self, value=None):
        self._name = value
    def getName(self):
        return self._name
    def setName(self, value):
        self._name = value
    name = property(getName, setName)

両方とも、以下のように実行して結果は勿論同じである。

u = User()
u.name = 'uran'
print(u.name)
# uran

しかし、、、

import json
print( json.dumps(u, default=lambda o:o.__dict__, indent=2) )

@property デコレータの方法のjson.dumps の結果

{
   "name": "uran"
}

property関数の方法のjson.dumps の結果

{
   "_name": "uran"
}

property関数の方法は、@property デコレータの方法より、記述が1行少なくて済み
メソッド名もかなり自由にできて良いかと思ったが、
上のように、jsonリアライスを実行すると、"_name" と
__init__ で定義した名称になってしまう。当たり前といえば、そうなのだが、、、
こうなると、property関数の方法のスタイルを採用するのも、
考え物である。