python笔记 私有变量

207 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第27天,点击查看活动详情

0 环境

  • 编辑器:pycharm或者vscode
  • 系统版本:windows10
  • python版本:3.9.6

1 私有变量

虽然我们可以将opening状态修改为123,并且修改成功了,但是我无法对状态做控制,我们需要一种局部或者私有变量,而在对比java bean这块的话,会有private这类的,很好帮我们做控制,python有么,也有的。使用双下划线控制,然后通过类里自定义的方法来获取/返回该值,不能直接修改了,就是私有变量了。

class Door:
    def __init__(self, number, status):
        # print(id(self))
        self.number = number
        self.status = status

    def open(self):
        self.status = "opening"
    

if __name__ == '__main__':
    door = Door(100, "closed")
    door.status = "123"
    print(door.status)

image.png

使用双下划线后,修改的代码如下:

本来实例变量是status,现在统统变成__status,并且新建一个实例方法,用来返回该__status的值。当我们在main中,使用了这个Door并初始化了,现在的状态是closed,当我再次对__status赋值后,打印__status,看似也没问题,但是当我打印status实例方法时,会发现__status并没有被改变。还有就是当首次初始Door后,和给__status赋值(door.__status = "123"),它俩中间插入一条,打印__status,这时候会报错,说Door对象没有该属性,是不是和类变量以及实例赋值同变量那个是不是有异曲同工之妙。

class Door:
    def __init__(self, number, status):
        # print(id(self))
        self.number = number
        self.__status = status

    def open(self):
        self.__status = "opening"

    def status(self):
        return self.__status

if __name__ == '__main__':
    door = Door(100, "closed")
    door.__status = "123"
    print(door.__status)
    print(door.status())

image.png

2 私有变量总结

为啥要这么麻烦呢,直接实例获取不好嘛,但是你没办法保证每个人都能做的对,既然如此,直接使用双下划线开头的变量+方法返回该变量,是不是就保护起来了。外部无法直接访问到,双下划线 + 变量/方法(后面没有双下划线了) = 私有某某。假如不加双下划线,就和java中的public xxx,加了就成了private xxxx。还有单下划线也会被认为是私有的,只要记住是约定俗成的就行。