Python3学习笔记18-访问限制
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。
但是,从Student类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性:
class Student(object):def __init__(self,name,score):self.name = nameself.score = score bart = Student('Bart Simpson',59) bart.score = 99 print(bart.score)
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__
在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
class Student1(object):def __init__(self,name,score):self.__name = nameself.__score = scoredef print_socre(self):print('%s:%s'%(self.__name,self.__score)) peter = Student1('Peter', 78) print(peter.__name)
访问会报错
当外部代码想要获取ame和score,可以给Student类增加get_name和get_score这样的方法
class Student2(object):def __init__(self,name,score):self.__name = nameself.__score = scoredef print_socre(self):print('%s:%s'%(self.__name,self.__score))def get_name(self):return self.__namedef get_score(self):return self.__score kael = Student2('kael',99) print(kael.get_name()) print(kael.get_score())
如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score方法:
class Student3(object):def __init__(self,name,score):self.__name = nameself.__score = scoredef print_socre(self):print('%s:%s'%(self.__name,self.__score))def get_name(self):return self.__namedef get_score(self):return self.__scoredef set_score(self,score):if 0 < score <100:self.__score = scoreelse:return ValueError('bad score') Anna = Student3('Anna',78) print(Anna.get_score()) Anna.set_score(88) print(Anna.get_score())
这样可以在set()方法中校验给出的数据是否是我们想要的,而不是随便传的
需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,
特殊变量是可以直接访问的,不是private变量
练习
请把下面的Student对象的gender字段对外隐藏起来,用get_gender()和set_gender()代替,并检查参数有效性:
class Student(object):def __init__(self, name, gender):self.name = nameself.gender = genderclass Student4(object):def __init__(self, name, gender):self.name = nameself.__gender = genderdef get_gender(self):return self.__genderdef set_gender(self,gender):self.__gender = gender bart = Student4('Bart', 'male') if bart.get_gender() != 'male':print('测试失败!') else:bart.set_gender('female')if bart.get_gender() != 'female':print('测试失败!')else:print('测试成功!')
转载于:https://www.cnblogs.com/myal/p/9337412.html
Python3学习笔记18-访问限制相关推荐
- 【计算机网络学习笔记18】防火墙技术、入侵检测技术
[计算机网络学习笔记18]防火墙技术.入侵检测技术 一.防火墙 防火墙 (firewall) :一种访问控制技术,通过严格控制进出网络边界的分组,禁止任何不必要的通信,从而减少潜在入侵的发生,尽可能降 ...
- Hadoop学习笔记—18.Sqoop框架学习
Hadoop学习笔记-18.Sqoop框架学习 一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据 ...
- python基础第三章选择结构答案-python3 学习笔记(二)选择结构、循环结构
python3 学习笔记 python 优雅 明确 简单 1.选择结构 (1)简单判断 if else 使用格式: if 条件: 表达式1 else: 表达式2 (2)多条件判断 elif 使用格式 ...
- Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel
Ext.Net GridPanel 有两种编辑模式:编辑单元格和编辑行. 单元格编辑: 行编辑: 可以看出,单元格编辑的时候,只有单元格会进入编辑模式,而行编辑模式中则对编辑行的所有可编辑字段统一进行 ...
- Android学习笔记---22_访问通信录中的联系人和添加联系人,使用事物添加联系人...
Android学习笔记---22_访问通信录中的联系人和添加联系
- 华为HCIA-datacom 学习笔记18——SDN与NFV概述
华为HCIA-datacom 学习笔记18--SDN与NFV概述 SDN与NFV概述 1.计算机时代的演进 1.1大型机 专门的硬件 专门的操作系统 专门的应用.(稳定性能好,但封闭) 1.2小型机 ...
- Python3学习笔记之-学习基础(第三篇)
Python3学习笔记之-学习基础(第三篇) 文章目录 目录 Python3学习笔记之-学习基础(第三篇) 文章目录 一.循环 1.for循环 2.while循环 3.break,continue 二 ...
- 2020-4-12 深度学习笔记18 - 直面配分函数 5 ( 去噪得分匹配,噪声对比估计NCE--绕开配分函数,估计配分函数)
第十八章 直面配分函数 Confronting the Partition Function 中文 英文 2020-4-8 深度学习笔记18 - 直面配分函数 1 ( 配分函数概念,对数似然梯度) 2 ...
- A Byte of Python3 学习笔记
A Byte of Python3 学习笔记 第七章 控制流 1.if语句(带输入函数) 2.while语句 3.for循环 4.break.continue.return的区别 第八章 函数 8.1 ...
- Python3 学习笔记
Python3 学习笔记 1.基础语法 1.1 字符串操作 title() 将单词首字母改为大写 upper() 所有字母改为大写 lower() 所有字母改为小写 str1+str2 字符串通过'+ ...
最新文章
- int main( int argc , char *argv[] , char *envp[] )中参数解说
- 另一种同步软件Unison的使用方法
- 2090. 「ZJOI2016」旅行者 分治,最短路
- Arm架构下VUE环境的安装
- C语言for循环的嵌套例题,c语言 for循环的嵌套(含答案)
- C++ 现代编程风格速查表
- 第一:Pycharm安装(非常详细)
- 数十亿个 Wi-Fi 设备存在缺陷,通信易被窃听!
- 【等价转换】—— min/max 的转换与互相转换
- MATLAB入门教程(3):数组的创建与使用
- 2019年ACM大赛:北大清华无缘前十,莫斯科大学第一
- yansongda 支付宝提现,商家转账
- 看我如何用云函数撸一个PC小程序代码包在线解密工具
- Oracle数据库管理系统(安装及入门教学)
- https证书怎么申请?
- java基于sptingboot+vue的校园疫情防控系统 elementui
- PAT 甲级1121 Damn Single
- 超哥笔记--shell 基本命令(4)
- Android 性能优化必知必会
- Opencv读取网络摄像头的rtsp流