可能重复:
What is the benefit to using a ‘get function’ for a python class?
我刚刚开始阅读Python,但我想知道为什么Python需要setter和getter呢?它已经有了像属性一样的对象变量
考虑
class C(object):
def _init_(self):
self._x = None
def get_x(self):
return self._x
def set_x(self, value):
self._x = valu
x = property(get_x, set_x)
我们可以只使用C.x =“value”来做我们想做的事吗?财产的好处是什么?
顺便说一下,用这种方式创建属性/ setter / getter对我来说很麻烦,有什么方法可以简化这个吗?喜欢class C()
has_attributes("x", "y", "z")
答案 0 :(得分:3)
您可以使用property
获取所需内容:
class C(object):
def _init_(self):
self._x = None
@property
def x(self):
return self._x
@x.setter
def x(self, value):
self._x = value
然后,您可以使用通常的属性语法访问该属性:
c = C()
c.x = 10 #calls the setter
print(c.x) #calls the getter
使用属性而不是普通数据属性有一些原因:
答案 1 :(得分:3)
使用普通属性:
class C(object):
def __init__(self):
self.x = None
稍后,如果有必要,可以将x更改为属性。 “@property”的美妙之处在于它允许开发人员不使用getter,setter和“@property”。
答案 2 :(得分:2)
class C(object):
def _init_(self):
self._x = None
def get_x(self):
return self._x
def set_x(self, value):
self._x = value
x = property(get_x, set_x)
现在你可以使用c.x =“foo”和set透明地获取。
set和getter的目的不是公开类内部。
想象一下将来
self._x
更改为
sql.save(id(self), value)
和get_x到:
value= sql.sql(id(self))
return convertFromDbFormatToExpectedApiFormat(value)
您只需更改该类中的getter和setter代码,而不是更改 所有与之沟通的课程。
class C(object):
def _init_(self):
self.sql = DDBB()
def get_x(self):
dbregistry = self.sql.fetch(id(self))
return convertFromDbFormatToExpectedApiFormat(dbregistry)
def set_x(self, value):
self.sql.save(id(self), value)
x = property(get_x, set_x)