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使用PyGreSQL操作PostgreSQL数据库教程
Jul 30 Python
Python实现冒泡,插入,选择排序简单实例
Aug 18 Python
基于python编写的微博应用
Oct 17 Python
Python实现拼接多张图片的方法
Dec 01 Python
Hadoop中的Python框架的使用指南
Apr 22 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
Apr 28 Python
Python制作简易注册登录系统
Dec 15 Python
python实现对指定输入的字符串逆序输出的6种方法
Apr 26 Python
Python解决两个整数相除只得到整数部分的实例
Nov 10 Python
Python常用模块os.path之文件及路径操作方法
Dec 03 Python
python3爬取torrent种子链接实例
Jan 16 Python
Python decimal模块使用方法详解
Jun 08 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版本实现代码
2012/09/15 PHP
ajax+php控制所有后台函数调用
2015/07/15 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
2016/05/19 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
2019/09/05 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
XRegExp 0.2: Now With Named Capture
2007/11/30 Javascript
Javascript 刷新全集常用代码
2009/11/22 Javascript
Extjs学习笔记之八 继承和事件基础
2010/01/08 Javascript
深入理解Javascript闭包 新手版
2010/12/28 Javascript
Javascript实现真实字符串剩余字数提示的实例代码
2013/10/22 Javascript
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
2016/01/05 Javascript
AngularJS模仿Form表单提交的实现代码
2016/12/08 Javascript
jQuery向webApi提交post json数据
2017/01/16 Javascript
bootstrap fileinput 上传插件的基础使用
2017/02/17 Javascript
vue axios 二次封装的示例代码
2017/12/08 Javascript
为什么说JavaScript预解释是一种毫无节操的机制详析
2018/11/18 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python通过线程实现定时器timer的方法
2015/03/16 Python
手把手教你用python抢票回家过年(代码简单)
2018/01/21 Python
python3处理含有中文的url方法
2018/05/10 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
使用python实现CGI环境搭建过程解析
2020/04/28 Python
Python TestSuite生成测试报告过程解析
2020/07/23 Python
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
澳大利亚最好的电动自行车:Leon Cycle
2020/12/19 全球购物
资深地理教师自我评价
2013/09/21 职场文书
科研课题实施方案
2014/03/18 职场文书
应聘会计求职信
2014/06/11 职场文书
2014财务人员自我评价范文
2014/09/21 职场文书
2015年秋季新学期寄语
2015/03/25 职场文书
法定代表人资格证明书
2015/06/18 职场文书
redis实现共同好友的思路详解
2021/05/26 Redis