【发布时间】: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 小部件的整数属性
width和right_border。现在不那么令人惊讶了,是吗? -
@delnan 与您的小部件示例很清楚,属性是依赖的,比如说我改变宽度,所以大小也改变,但是在语义上不太接近的属性我认为这很难避免'如果我在定义中没有明确说明,则为思维导图。
-
请举个例子。正如我所说,我只能想象问题来自不清楚的名称或其他东西。或者也许属性不应该相互影响。
-
@delnan 问题是我有一个字体类型的名称属性,而必须更改的属性是字体的 url 名称,所以我有 font_name 和 font_url_name。字体名称可以是 'foo bar' 和 font_url_name 'foo-bar'
-
这似乎也很明显......
标签: python properties naming-conventions