TL;DR: property() された変数ごとに一意のゲッターとセッターのセットを定義する必要があるのは面倒です。一般的なゲッターとセッターを定義して、必要な変数で使用できますか?
いくつかの素敵なゲッターとセッターでクラスを作成するとしましょう:
class Foo
def getter(self):
return _bar+' sasquatch'
def setter(self, value):
_bar = value+' unicorns'
bar = property(getter, setter)
かなりいいですよね?
ここで、「baz」という別の変数を入れて、このサスカッチ/ユニコーンの楽しみから除外したくないとしましょう。さて、ゲッターとセッターの別のセットを作成できると思います。
class Foo
def bar_getter(self):
return _bar+' sasquatch'
def bar_setter(self, value):
_bar = value+' unicorns'
bar = property(bar_getter, bar_setter)
def baz_getter(self):
return _baz+' sasquatch'
def baz_setter(self, value):
_baz = value+' unicorns'
baz = property(baz_getter, baz_setter)
しかし、それはあまり DRY ではなく、私のコードを不必要に混乱させます。私はそれを少しDRYerにすることができると思います:
class Foo
def unicornify(self, value):
return value+' unicorns'
def sasquatchify(self, value):
return value+' sasquatch'
def bar_getter(self):
return self.sasquatchify(_bar)
def bar_setter(self, value):
_bar = self.unicornify(_bar)
bar = property(bar_getter, bar_setter)
def baz_getter(self):
return self.sasquatchify(_baz)
def baz_setter(self, value):
_baz = self.unicornify(_baz)
baz = property(baz_getter, baz_setter)
それは私のコードを DRYer にするかもしれませんが、理想的ではありません。さらに 2 つの変数を unicornify して sasquatchify したい場合は、さらに 4 つの関数を追加する必要があります。
これを行うためのより良い方法があるはずです。複数の変数に対して単一のジェネリック getter および/または setter を使用できますか?
ユニコーンとサスカッチのない現実世界の実装: 私は SQLAlchemy ORM を使用しており、データベースからデータを保存および取得するときにデータの一部を変換したいと考えています。一部の変換は複数の変数に適用できますが、クラスを getter と setter で混乱させたくありません。