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的Flask框架中的Jinja2模板引擎学习教程
Jun 30 Python
Python通过matplotlib画双层饼图及环形图简单示例
Dec 15 Python
Python实现PS图像调整之对比度调整功能示例
Jan 26 Python
代码详解django中数据库设置
Jan 28 Python
python实现中文文本分句的例子
Jul 15 Python
python 单线程和异步协程工作方式解析
Sep 28 Python
python编写猜数字小游戏
Oct 06 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
Nov 29 Python
python解析xml文件方式(解析、更新、写入)
Mar 05 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
May 07 Python
Python logging模块写入中文出现乱码
May 21 Python
Python在字符串中处理html和xml的方法
Jul 31 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
解决控件遮挡问题:关于有窗口元素和无窗口元素
2007/01/28 PHP
php+mysql开源XNA 聚合程序发布 下载
2007/07/13 PHP
在PHP中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
php实现快速排序法函数代码
2012/08/27 PHP
PHP访问Google Search API的方法
2015/03/05 PHP
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
JavaScript实现重置表单(reset)的方法
2015/04/02 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
javascript实现跨域的方法汇总
2015/06/25 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
利用Angular.js限制textarea输入的字数
2016/10/20 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
ReactNative 之FlatList使用及踩坑封装总结
2017/11/29 Javascript
jQuery实现右侧抽屉式在线客服功能
2017/12/25 jQuery
详解React开发必不可少的eslint配置
2018/02/05 Javascript
浅谈AngularJS中$http服务的简单用法
2018/05/15 Javascript
JavaScript实现页面中录音功能的方法
2019/06/04 Javascript
JS Generator 函数的含义与用法实例总结
2020/04/08 Javascript
javascript实现贪吃蛇经典游戏
2020/04/10 Javascript
JavaScript 防抖和节流遇见的奇怪问题及解决
2020/11/20 Javascript
使用SAE部署Python运行环境的教程
2015/05/05 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
5种Python单例模式的实现方式
2016/01/14 Python
Python利用Scrapy框架爬取豆瓣电影示例
2020/01/17 Python
Python telnet登陆功能实现代码
2020/04/16 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
《北京的春节》教学反思
2014/04/07 职场文书
村班子对照检查材料
2014/08/18 职场文书
团代会开幕词
2015/01/28 职场文书
服务员岗位职责
2015/02/03 职场文书
党员干部学习心得体会
2016/01/23 职场文书
2019思想汇报范文
2019/05/21 职场文书