Python属性与组合Set / Get方法

时间:2013-05-25 11:30:44

标签: python properties setter getter

我知道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

对我而言,这比执行属性更紧凑,我相信我的代码更具可读性。

因此,我的方法有什么问题,还是出于某种原因是单一的?

谢谢!

1 个答案:

答案 0 :(得分:2)

第一个问题是界面不同,可以说不太清楚。 unit.position = new_pos已变为unit.position(new_pos)。对于某些语言中的变异,这是一种可接受的拼写,但在Python中却没有那么多。几乎没有人这样做:即使未使用property,通常也会有单独的getset方法。换句话说,您的代码将成为非惯用且令人困惑的代码。

结果是增强的赋值运算符不再起作用: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