我应该在Python方法名称中使用get_/set_前缀吗?

21

在Python中,属性(property)被用于替代Java风格的getter和setter。因此,在类的公共接口中很少见到get...set...方法。

但是,在某些情况下,如果属性不合适,仍然可能会出现行为类似于getter或setter的方法。现在我的问题是:这些方法名应该以get_/set_开头吗?还是说这种冗长不符合Python的风格,因为往往很明显意思是什么(并且可以使用文档字符串来澄清非显而易见的情况)?

这可能是个人品味问题,但我对大多数人的想法很感兴趣。作为API用户,您更喜欢哪种方式呢?

例如,假设我们有一个表示多个城市的对象。一个方法可能是get_city_by_postalcode(postalcode),或者可以使用更短的方法city_by_postalcode。我倾向于后者。


“cases were a property is not appropriate”有些困难。一个例子会有所帮助。属性非常有用,很难想象哪里不适合使用它们。 - S.Lott
@S.Lott:关于我提供的例子怎么样?它不是通常意义上的getter,但“get”可能是最合适的动词。 - nikow
5个回答

7
你永远不会失去使用描述符将属性变成getter/setter的机会。如果想把某个属性改为只读,也可以用与该属性同名的getter方法替换它,并用@property进行修饰。因此,我的建议是除非你所在的项目已经使用它们,否则应避免使用getter/setter,因为你随时可以改变主意,使属性变为只读、只写或其他模式,而无需修改类的接口。

5

我认为短小精悍更好,所以我倾向于后者。但重要的是在项目中保持一致:不要混合两种方法。如果你加入了别人的项目,请遵循最初选择的开发者的方式。


4
如果它可以用作属性(只有一个值可获取或设置,且没有其他参数),通常我会这样做:
class Foo(object):

    def _get_x(self):
        pass

    def _set_x(self, value):
        pass

    x = property(_get_x, _set_x)

如果getter/setter比这个更复杂,我会使用get_x和set_x:


1

我看过两种方式。来自Objective-C背景,如果不能使用属性(尽管我尽可能使用属性),我通常会使用foo()/set_foo()。不过,这并不是很重要,只要你保持一致

(当然,在你的例子中,我根本不会称方法为get_city_by_postalcode();我可能会选择translate_postalcode或类似使用更好的动作动词命名的名称。)


3
实际上,我认为“get_city_by_postalcode”比“translate_postalcode”更具描述性。 - Jeremy Cantrell

0
如果我必须使用getter/setter,我喜欢这种方式:
假设您有一个变量self._x。那么x()将返回self._x的值,setX(x)将设置self._x的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接