我知道python中的属性以及它们如何能够像以前一样使用类属性,但之间可能会有一些修改。
无论如何,最近我做了一些perl,我开始喜欢拥有更少的代码并让getter和setter合并的想法
像:
sub filename {
my $self = shift;
my $filename = shift;
if ($filename){ $self->$filename = $filename;}
else {return $self->$filename;}
}
显然在perl中你可以省略方法背后的(),这使得这种方法“更清晰”,对我班级的用户更加透明。
在py中我可以做类似唯一的缺点是访问时需要():
def filename(self, setter=None):
if setter is not None:
self._filename = setter
else:
return self._filename
对我而言,这比执行属性更紧凑,我相信我的代码更具可读性。
因此,我的方法有什么问题,还是出于某种原因是单一的?
谢谢!
答案 0 :(得分:2)
第一个问题是界面不同,可以说不太清楚。 unit.position = new_pos
已变为unit.position(new_pos)
。对于某些语言中的变异,这是一种可接受的拼写,但在Python中却没有那么多。几乎没有人这样做:即使未使用property
,通常也会有单独的get
和set
方法。换句话说,您的代码将成为非惯用且令人困惑的代码。
结果是增强的赋值运算符不再起作用:unit.position += velocity
是不可能的(如果.position
是属性,则它有效)。
另一个潜在的问题是,这不支持将属性设置为None
。你必须发明自己的哨兵价值(NO_VALUE = object()
等),使整个考验变得更加丑陋。
实现方面的假设好处非常小:当您保存一两行空行时,您需要额外的缩进和条件。请注意,属性不仅仅是设置或返回(否则它不应该是属性)。属性(8行)
@property
def width(self, new_width):
self._width = new_width
self._dirty = True
@width.setter
def width(self):
return self._width
与getter-setter-method(6行):
def width(self, new_width=None):
if new_width is not None:
self._width = new_width
self._dirty = True
else:
return self._width
您可以保存一个空白行和一个非空行,但为此您需要支付
else
)