Python属性与组合Set/Get方法
我了解python中的属性,以及它们如何使使用classes属性成为可能,就像以前一样,但在两者之间进行一些可能的修改 不管怎样,最近我做了一些perl,我开始喜欢更少的代码,并将getter和setter结合起来的想法 比如: 显然,在perl中,可以省略方法后面的(),这使得这种方法对我的类的用户来说“更干净”和更透明 在py中,我可以做类似的事情,唯一的缺点是在访问时需要使用()Python属性与组合Set/Get方法,python,properties,setter,getter,Python,Properties,Setter,Getter,我了解python中的属性,以及它们如何使使用classes属性成为可能,就像以前一样,但在两者之间进行一些可能的修改 不管怎样,最近我做了一些perl,我开始喜欢更少的代码,并将getter和setter结合起来的想法 比如: 显然,在perl中,可以省略方法后面的(),这使得这种方法对我的类的用户来说“更干净”和更透明 在py中,我可以做类似的事情,唯一的缺点是在访问时需要使用() def filename(self, setter=None): if setter is not N
def filename(self, setter=None):
if setter is not None:
self._filename = setter
else:
return self._filename
对我来说,这比做属性更紧凑,我相信我的代码更可读
那么,我的方法有什么问题吗?或者出于某种原因,它是不符合实际的吗
谢谢 第一个问题是界面不同,可以说不太清晰
unit.position=new\u pos
变为unit.position(new\u pos)
。在某些语言中,这是一种公认的变异拼写,但在Python中却不是这样。几乎没有人这样做:即使不使用属性
,通常也有单独的get
和set
方法。换句话说,您的代码将以非惯用和令人困惑的方式脱颖而出
结果是增广赋值运算符不再工作:unit.position+=velocity
不可能(如果.position
是一个属性,它就可以工作)。
另一个潜在问题是,它不支持将属性设置为None
。你必须发明你自己的哨兵价值观(NO_value=object()
等等),让整个苦难变得更加丑陋
实现方面的好处很小:虽然保存一两行空行,但需要额外的缩进和条件。请注意,属性不仅仅是设置或返回(否则它不应该是属性)。属性(8行)
与getter setter方法相比(6行):
您可以保存一个空行和一个非空行,但为此您需要付费
- 糟糕的界面
- 更多缩进
- 错误的可能性更大(例如,在条件中输入错误,忘记了
)其他
def filename(self, setter=None):
if setter is not None:
self._filename = setter
else:
return self._filename
@property
def width(self, new_width):
self._width = new_width
self._dirty = True
@width.setter
def width(self):
return self._width
def width(self, new_width=None):
if new_width is not None:
self._width = new_width
self._dirty = True
else:
return self._width