1

我有一个有两个属性的类,当我为我设置一个新值时,foo我希望它的值bar也改变,所以我可以使用这样的东西:

class MyClass(object):

  _foo = ''
  _bar = ''

  @property
  def foo(self):
    return self._foo

  @foo.setter
  def foo(self, foo):
    self._foo = foo.lower()
    self._bar = foo.upper()

  @property
  def bar(self):
    return self._bar

我不想以当我改变 changebar 的值时反映另一个方向的foo变化,所以我没有实现 setter for bar.

阅读有关干净代码实践的内容后,我发现根据方法的确切作用来命名方法是一个好习惯,因此我认为,与其使用上面的语法,不如使用这个似乎更易于解释的定义:

def set_foo_and_bar(self, foo):
  self._foo = foo.lower()
  self._bar = foo.upper()

现在的问题是我失去了pythonic语法object.property。真诚地我认为这是一个愚蠢的问题,但我想知道处理这种依赖操作的定义的好习惯是什么,我应该使用第一种语法还是第二种?,如果该setter方法更多地改变状态怎么办大幅度地,说改变更多的属性?,我应该使用注释来说明这两个属性之间存在依赖关系吗?还是让客户自己发现“神奇”的行为?

4

1 回答 1

0

我意识到这是一个老问题,但似乎答案很简单。装饰器foo.setter返回一个新property对象,装饰函数作为该属性的设置器,装饰器语法意味着这个返回值存储在函数的位置。因此,如果您希望您的foo属性正常工作,您还需要命名装饰函数foo。如果你使用不同的函数名,你要么不能使用装饰器语法,要么你的属性会被破坏。

如果有意义的变量名对您来说至关重要,您可能应该手动应用property到您的 getter 和 setter 方法:

class MyClass(object):

  _foo = ''
  _bar = ''

  def _get_foo(self):
    return self._foo

  def _set_foo_and_bar(self, foo):
    self._foo = foo.lower()
    self._bar = foo.upper()

  foo = property(_get_foo, _set_foo_and_bar)

  @property
  def bar(self):
    return self._bar

这对我来说似乎不是很有用。除非有迫切的理由不这样做,否则我总是喜欢装饰器语法。问题中的代码可以完美地完成工作。

于 2014-05-01T04:01:28.337 回答