在Python中设置方法,它们是否必要?

时间:2014-08-31 13:03:02

标签: python

我一直在用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书籍,但对我来说这似乎毫无意义,是否有必要?

3 个答案:

答案 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中的Getter / Setter主要用于维护encapsulation concept以及对对象的内部变量进行访问控制,输入验证,触发和许多其他操作,这是OOP设计中的一个概念,它适用所有编程语言。

你总是可以在(据称)任何编程语言中定义公共成员变量,但是一个好的OOP设计不应该将任何内部实现细节暴露给外部世界,类应该只暴露所需的内容并且应该严格控制访问它并验证输入。

有关详细信息,您可以查看this Programmers Stack Exchange question,一般适用于OOP的信息。