【问题标题】:Naming convention for a property setter that change two properties values in python在 python 中更改两个属性值的属性设置器的命名约定
【发布时间】:2013-04-27 15:00:27
【问题描述】:

我有一个有两个属性的类,当我为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

我不想以当我更改bar 时的方式反映另一个方向的变化 foo 的值发生了变化,所以我没有实现 bar 的设置器。

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

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

现在的问题是我丢失了 Python 语法 object.property。真诚地,我认为这是一个愚蠢的问题,但我想知道处理 这种依赖操作的定义,我应该使用第一种语法还是第二种?,如果setter 方法更剧烈地改变状态,比如改变更多属性,我应该使用 cmets 来说明两者之间存在依赖关系吗?那两个属性?还是让客户自己发现这种“神奇”行为?

【问题讨论】:

  • 使用占位符名称,当然并不明显。但是在实际代码中,我假设任何不清楚的情况都来自于错误的命名。例如,假设 GUI 小部件的整数属性 widthright_border。现在不那么令人惊讶了,是吗?
  • @delnan 与您的小部件示例很清楚,属性是依赖的,比如说我改变宽度,所以大小也改变,但是在语义上不太接近的属性我认为这很难避免'如果我在定义中没有明确说明,则为思维导图。
  • 请举个例子。正如我所说,我只能想象问题来自不清楚的名称或其他东西。或者也许属性不应该相互影响。
  • @delnan 问题是我有一个字体类型的名称属性,而必须更改的属性是字体的 url 名称,所以我有 font_name 和 font_url_name。字体名称可以是 'foo bar' 和 font_url_name 'foo-bar'
  • 这似乎也很明显......

标签: python properties naming-conventions


【解决方案1】:

我意识到这是一个老问题,但答案似乎很简单。 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

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

【讨论】:

    猜你喜欢
    • 2017-12-07
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2015-11-21
    • 2017-03-28
    • 1970-01-01
    相关资源
    最近更新 更多