我一直在用Java和C ++编写OOP概念,最近我开始使用Python。据我所知,Python并不一定在其类中包含私有变量,因此程序员可以直接访问它们。例如,如果我有:
class Whatever:
#constructor
def __init__(self,x):
self.x=x
所以程序员可以像这样轻松地修改x的值:
w=Whatever(4)
w.x=6
在这一点上,我想知道是否真的有必要使用像以下那样的setter方法:
setW(self,x)
self.x=x
代码中的冗余不是最后一个吗?我已经看过一些努力做到这一点的Python书籍,但对我来说这似乎毫无意义,是否有必要?
答案 0 :(得分:3)
我自然会想到一个原因:输入验证。
如果Whatever.x
应该是日期但是设置为整数,会发生什么?一些类设计需要这种验证,这是完成它的完美方式:
class Whatever:
#constructor
def __init__(self):
self._x=None
@property
def x(self):
"""I'm the 'x' property."""
return self._x
@x.setter
def x(self, value):
if isinstance(value, datetime): #silly example
self._x = value
else:
raise ValueError('Was expecting a date')
话虽这么说,但是对于每个类数据都有getter和setter不被认为非常 pythonic 。一些不需要这种保护的变量可以通过实例接口正常访问。
答案 1 :(得分:0)
Python允许将任意成员添加到类中,因此使用set方法提供了额外的检查以使拼写错误更明显:
class Whatever:
def __init__(self,v):
self.some_value = v
def setSomeValue(v):
self.some_value = v
w=Whatever(4)
w.some_valu = 6 # No error!
w.setSomeValu(6) # Error
答案 2 :(得分:0)
你总是可以在(据称)任何编程语言中定义公共成员变量,但是一个好的OOP设计不应该将任何内部实现细节暴露给外部世界,类应该只暴露所需的内容并且应该严格控制访问它并验证输入。
有关详细信息,您可以查看this Programmers Stack Exchange question,一般适用于OOP的信息。