TL;DR:必须为每个 property() 的变量定义一组唯一的 getter 和 setter 很糟糕。我可以定义通用的 getter 和 setter 并将它们与我想要的任何变量一起使用吗?
假设我用一些不错的 getter 和 setter 创建了一个类:
class Foo
def getter(self):
return _bar+' sasquatch'
def setter(self, value):
_bar = value+' unicorns'
bar = property(getter, setter)
非常棒,对吧?
现在假设我放入了另一个名为“baz”的变量,我不希望它被这个野人/独角兽的乐趣所遗漏。好吧,我想我可以制作另一组 getter 和 setter:
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)
但这不是很干,并且不必要地使我的代码混乱。我想我可以让它更干燥一点:
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)
尽管这可能会使我的代码更干燥,但这并不理想。如果我想将另外两个变量进行 unicornify 和 sasquatchify,我将不得不再添加四个函数!
必须有更好的方法来做到这一点。我可以跨多个变量使用单个通用 getter 和/或 setter 吗?
Unicorn-less 和 sasquatch-less 实际实现: 我正在使用 SQLAlchemy ORM,并且希望在从数据库中存储和检索数据时转换一些数据。一些转换适用于多个变量,我不想让我的类与 getter 和 setter 混淆。