32


9

Pythonでプロパティを定義する好ましい方法:プロパティデコレータまたはラムダ?

Pythonでクラスプロパティを定義する好ましい方法はどれですか? 1つのクラスで両方を使用しても大丈夫ですか?

@property
def total(self):
    return self.field_1 + self.field_2

or

total = property(lambda self: self.field_1 + self.field_2)

3 Answer


50


読み取り専用のプロパティの場合、デコレータを使用します。それ以外の場合、通常は次のようにします。

class Bla(object):
    def sneaky():
        def fget(self):
            return self._sneaky
        def fset(self, value):
            self._sneaky = value
        return locals()
    sneaky = property(**sneaky())

更新:

最近のバージョンのpythonは、デコレータアプローチを強化しました。

class Bla(object):
    @property
    def elegant(self):
        return self._elegant

    @elegant.setter
    def elegant(self, value):
        self._elegant = value


21


デコレータフォームは、おそらく、メソッドを読み取り専用プロパティに変換したい場合に最適です。 2番目のケースは、setter / deleter / docstringとgetterを提供する場合、または値を派生するメソッドに異なる名前を持つプロパティを追加する場合に適しています。


4


これにはラムダを使用しないでください。 1つ目は読み取り専用プロパティに使用でき、2つ目はより複雑な場合に実際のメソッドで使用されます。