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

2024-07-05 10:12:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在编程编程概念,主要是在java和C++中,最近我已经开始使用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书籍,它们努力做到这一点,但对我来说,这似乎毫无意义,有必要吗?你知道吗


Tags: 方法代码self概念initdef编程java
3条回答

OOP中的getter/setter主要是维护encapsulation concept,并对对象的内部变量进行访问控制、输入验证、触发等操作,这是OOP设计中的一个概念,适用于所有编程语言。你知道吗

你可以用任何编程语言定义公共成员变量,但是一个好的OOP设计不应该对外公开任何内部实现细节,一个类应该只公开所需的内容,并且应该严格控制对它的访问并验证输入。你知道吗

有关更多信息,请查看this Programmers Stack Exchange question,这里的信息通常适用于OOP。你知道吗

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

一个原因自动浮现在我的脑海中:输入验证。你知道吗

如果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的。一些不需要这种保护的变量可以通过实例接口正常访问。你知道吗

相关问题 更多 >