Pythonでクラスプロパティを定義する好ましい方法はどれですか、そしてその理由は?Ok 1つのクラスで両方を使用することですか?
@property
def total(self):
return self.field_1 + self.field_2
または
total = property(lambda self: self.field_1 + self.field_2)
デコレータフォームは、メソッドを読み取り専用プロパティにしたい場合におそらく最適です。 2番目のケースは、setter/deleter/docstringとgetterを提供する場合、または値の派生元のメソッドに別の名前のプロパティを追加する場合に適しています。
読み取り専用プロパティの場合は、デコレータを使用します。それ以外の場合は、通常、次のようにします。
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
これにはラムダを使用しないでください。 1つ目は読み取り専用のプロパティに使用でき、2つ目はより複雑なケースの実際のメソッドで使用されます。