Python属性与组合Set/Get方法

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

我了解python中的属性,以及它们如何使使用classes属性成为可能,就像以前一样,但在两者之间进行一些可能的修改

不管怎样,最近我做了一些perl,我开始喜欢更少的代码,并将getter和setter结合起来的想法

比如:

显然,在perl中,可以省略方法后面的(),这使得这种方法对我的类的用户来说“更干净”和更透明

在py中,我可以做类似的事情,唯一的缺点是在访问时需要使用()

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行):

您可以保存一个空行和一个非空行,但为此您需要付费

  • 糟糕的界面
  • 更多缩进
  • 错误的可能性更大(例如,在条件中输入错误,忘记了
    其他

delnan,我明白你的意思,你说得有点对。我看到了身份识别的问题。我个人认为方法越多=行越多=越臃肿,越不简洁。当你有一个类有10个属性的时候,我就很难保持概述了。但也许这只是我。:-)谢谢你的意见@德尔南的意见也是我的(+1)。python的各个部分以许多很酷的方式结合在一起。如果你发明了你自己的“部件”或习惯用法,你将失去未来的功能(例如,排序迭代或递增属性)@PhilCooper你是对的,我很清楚我会走一条单一的道路,我只是想知道人们对这些方法有何看法。就我所见,除了不地道之外,对perl/scala方式也没有多少抱怨。@Alessandro在我的第二段中看到了两个缺点,尽管它们并不适用于所有情况。这篇文章的其余部分对你所说的代码更少、可读性更强的说法提出了质疑。
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