1

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

对我来说,这只是比做属性更紧凑,我相信我的代码更具可读性。

那么我的方法有什么问题还是出于某种原因它是单调的?

谢谢!

4

1 回答 1

3

第一个问题是界面不同,而且可能不太清楚。 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
于 2013-05-25T11:47:14.440 回答