我偶然发现了下面在另一个问题中使用getter和setter的例子 Preferred way of defining properties in Python: property decorator or lambda?
由于python具有隐式getter和setter,我想知道是什么原因明确定义它们如下所示。这些例子中是否有任何优势,或者只有当getter / setter涉及比下面的简化示例更复杂的事情时它才有意义?
class Bla(object):
def sneaky():
def fget(self):
return self._sneaky
def fset(self, value):
self._sneaky = value
return locals()
sneaky = property(**sneaky())
最新版本的python增强了装饰器方法:
class Bla(object):
@property
def elegant(self):
return self._elegant
@elegant.setter
def elegant(self, value):
self._elegant = value
答案 0 :(得分:2)
通常您应该使用属性访问权限。如果他们只是增加开销
,那么getter和setter就毫无意义Python将getter和setter绑定到属性的方式很好,就是你可以轻松地将属性更改为属性,而无需去重构所有使用该类的代码。
答案 1 :(得分:1)
您已经回答了自己关于语法差异的问题。你的第二个片段在以前的版本中是不可能的,因此是第一个例子。
在Python中,没有太多的增值来为vanilla get / set组合在这个问题上定义一个属性(在编译语言中更像是一个问题,比如C#,从字段变为属性将需要重新编译所有客户端代码,而在C#中对属性的实现的更改不一定需要重新编译)。通常,一个或两个方法通常都包含一些逻辑(验证,懒惰初始化)。
有时您可能希望将属性设为只读,因此您可以这样做:
@property
def foo(self):
return self.__foo
虽然不是严格的只读,但它需要你处理python名称 - 自己修改。