web-dev-qa-db-ja.com

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

Pythonでクラスプロパティを定義する好ましい方法はどれですか、そしてその理由は?Ok 1つのクラスで両方を使用することですか?

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

または

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

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

22
Benno

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

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
51
Toni Ruža

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