python: why getter & setter? how can I set attribute quickly?
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
What is the benefit to using a ‘get function’ for a python class?
号
我刚开始读python,但我想知道为什么python需要setter和getter?它已经有了类似于属性的对象变量
考虑
1 2 3 4 5 6 7 8 9 10 | 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"来做我们想做的吗?财产的好处是什么?
顺便说一句,用这种方式创建属性/设置器/getter对我来说很麻烦,有什么方法可以简化这个过程吗?喜欢
1 2 | class C() has_attributes("x","y","z") |
号
使用普通属性:
1 2 3 | class C(object): def __init__(self): self.x = None |
稍后,如果需要,可以将X更改为属性。"@property"的优点是允许开发者不使用getter、setter和"@property"。
您可以使用
1 2 3 4 5 6 7 8 9 10 | 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 |
。
然后,可以使用常用的属性语法访问属性:
1 2 3 | c = C() c.x = 10 #calls the setter print(c.x) #calls the getter |
。
使用属性而不是纯数据属性有一些原因:
- 您可以记录属性
- 您可以通过使属性为只读或检查正在设置的类型/值来控制对该属性的访问。
- 您不会破坏向后兼容性:如果某个东西是一个普通的实例属性,然后您决定将它转换为一个属性,那么使用该属性的代码仍然可以工作。如果使用get/set显式方法,则使用旧API的所有代码都必须更改
- 它比使用显式get/set方法更具可读性。
1 2 3 4 5 6 7 8 9 10 11 | 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",并透明地获取。
集合和getter的目的是不公开类内部。
想象一下未来
1 | self._x |
号
更改为
1 | sql.save(id(self), value) |
然后让你去:
1 2 | value= sql.sql(id(self)) return convertFromDbFormatToExpectedApiFormat(value) |
。
您只需要更改该类中getter和setter的代码,而不需要更改与之通信的所有类。
1 2 3 4 5 6 7 8 9 10 11 12 | 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) |