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启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
Apr 09 Python
python读取json文件并将数据插入到mongodb的方法
Mar 23 Python
Python简单操作sqlite3的方法示例
Mar 22 Python
Python机器学习之决策树算法
Dec 22 Python
使用python爬虫实现网络股票信息爬取的demo
Jan 05 Python
python多线程并发实例及其优化
Jun 27 Python
python脚本实现mp4中的音频提取并保存在原目录
Feb 27 Python
python golang中grpc 使用示例代码详解
Jun 03 Python
python 瀑布线指标编写实例
Jun 03 Python
用python实现名片管理系统
Jun 18 Python
python中判断文件结束符的具体方法
Aug 04 Python
如何利用Python实现n*n螺旋矩阵
Jan 18 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的ajax框架xajax入门与试用介绍
2010/12/19 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
2013/06/05 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
方便实用的jQuery checkbox复选框全选功能简单实例
2013/10/09 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
JavaScript中constructor()方法的使用简介
2015/06/05 Javascript
JavaScript实现点击按钮就复制当前网址
2015/12/14 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
js中url对象化管理分析
2017/12/29 Javascript
nodejs 生成和导出 word的实例代码
2018/07/31 NodeJs
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
JS实现可以用键盘方向键控制的动画
2020/12/11 Javascript
Python查询Mysql时返回字典结构的代码
2012/06/18 Python
Python抽象类的新写法
2015/06/18 Python
在Python中使用AOP实现Redis缓存示例
2017/07/11 Python
Python学习笔记之if语句的使用示例
2017/10/23 Python
Python的argparse库使用详解
2018/10/09 Python
python如何查看微信消息撤回
2018/11/27 Python
python判断一个数是否能被另一个整数整除的实例
2018/12/12 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
Django REST framework 如何实现内置访问频率控制
2019/07/23 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
网站域名和主机:Domain.com
2019/04/01 全球购物
公司拓展活动方案
2014/02/13 职场文书
国庆宣传标语
2014/06/30 职场文书
迎新生欢迎词
2015/01/23 职场文书
创业计划书之情侣餐厅
2019/09/29 职场文书
Python中可变和不可变对象的深入讲解
2021/08/02 Python
python使用BeautifulSoup 解析HTML
2022/04/24 Python