Python中设置变量访问权限的方法


Posted in Python onApril 27, 2015

在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。

但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性:

>>> bart = Student('Bart Simpson', 98)
>>> bart.score
98
>>> bart.score = 59
>>> bart.score
59

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问,所以,我们把Student类改一改:

class Student(object):

 def __init__(self, name, score):
  self.__name = name
  self.__score = score

 def print_score(self):
  print '%s: %s' % (self.__name, self.__score)

改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了:

>>> bart = Student('Bart Simpson', 98)
>>> bart.__name
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute '__name'

这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。

但是如果外部代码要获取name和score怎么办?可以给Student类增加get_name和get_score这样的方法:

class Student(object):
 ...

 def get_name(self):
  return self.__name

 def get_score(self):
  return self.__score

如果又要允许外部代码修改score怎么办?可以给Student类增加set_score方法:

class Student(object):
 ...

 def set_score(self, score):
  self.__score = score

你也许会问,原先那种直接通过bart.score = 59也可以修改啊,为什么要定义一个方法大费周折?因为在方法中,可以对参数做检查,避免传入无效的参数:

class Student(object):
 ...

 def set_score(self, score):
  if 0 <= score <= 100:
   self.__score = score
  else:
   raise ValueError('bad score')

需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名。

有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量:

>>> bart._Student__name
'Bart Simpson'

但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。

总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉。

Python 相关文章推荐
python简单实现获取当前时间
Aug 27 Python
Python 判断是否为质数或素数的实例
Oct 30 Python
Python列表删除的三种方法代码分享
Oct 31 Python
Python时间戳使用和相互转换详解
Dec 11 Python
python脚本实现验证码识别
Jun 07 Python
Python版名片管理系统
Nov 30 Python
Python3 Post登录并且保存cookie登录其他页面的方法
Dec 28 Python
Python中常用的8种字符串操作方法
May 06 Python
Python实现FM算法解析
Jun 18 Python
python Manager 之dict KeyError问题的解决
Dec 21 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
Feb 03 Python
Xadmin+rules实现多选行权限方式(级联效果)
Apr 07 Python
理解Python中的类与实例
Apr 27 #Python
简述Python中的面向对象编程的概念
Apr 27 #Python
介绍Python中的__future__模块
Apr 27 #Python
在Python中使用第三方模块的教程
Apr 27 #Python
在Python中使用模块的教程
Apr 27 #Python
详细介绍Python中的偏函数
Apr 27 #Python
举例讲解Python中装饰器的用法
Apr 27 #Python
You might like
PHP数据集构建JSON格式及新数组的方法
2012/11/07 PHP
学习php设计模式 php实现桥梁模式(bridge)
2015/12/07 PHP
FileUpload上传图片(图片不变形)
2010/08/05 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
node.js入门实例helloworld详解
2015/12/23 Javascript
JS实现Select的option上下移动的方法
2016/03/01 Javascript
jQuery链式调用与show知识浅析
2016/05/11 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
利用jquery禁止外层滚动条的滚动
2017/01/05 Javascript
详解Vue + Vuex 如何使用 vm.$nextTick
2017/11/20 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
JS实现将链接生成二维码并转为图片的方法
2018/03/17 Javascript
详解vue中axios的封装
2018/07/18 Javascript
Vue点击切换颜色的方法
2018/09/13 Javascript
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
原生JavaScript实现轮播图
2021/01/10 Javascript
python下如何让web元素的生成更简单的分析
2008/07/17 Python
Python实例一个类背后发生了什么
2016/02/09 Python
python抓取文件夹的所有文件
2018/02/27 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
django解决跨域请求的问题
2018/11/11 Python
python中对_init_的理解及实例解析
2019/10/11 Python
在python中利用pycharm自定义代码块教程(三步搞定)
2020/04/15 Python
python将unicode和str互相转化的实现
2020/05/11 Python
浅析CSS3中鲜为人知的属性:-webkit-tap-highlight-color
2017/01/12 HTML / CSS
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
总经理任命书范本
2014/06/05 职场文书
客户经理岗位职责
2015/01/31 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书
Oracle创建只读账号的详细步骤
2021/06/07 Oracle