在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-访问限制相关推荐

  1. 【计算机网络学习笔记18】防火墙技术、入侵检测技术

    [计算机网络学习笔记18]防火墙技术.入侵检测技术 一.防火墙 防火墙 (firewall) :一种访问控制技术,通过严格控制进出网络边界的分组,禁止任何不必要的通信,从而减少潜在入侵的发生,尽可能降 ...

  2. Hadoop学习笔记—18.Sqoop框架学习

    Hadoop学习笔记-18.Sqoop框架学习 一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据 ...

  3. python基础第三章选择结构答案-python3 学习笔记(二)选择结构、循环结构

    python3 学习笔记 python 优雅 明确 简单 1.选择结构 (1)简单判断 if else 使用格式: if  条件: 表达式1 else: 表达式2 (2)多条件判断 elif 使用格式 ...

  4. Ext.Net学习笔记18:Ext.Net 可编辑的GridPanel

    Ext.Net GridPanel 有两种编辑模式:编辑单元格和编辑行. 单元格编辑: 行编辑: 可以看出,单元格编辑的时候,只有单元格会进入编辑模式,而行编辑模式中则对编辑行的所有可编辑字段统一进行 ...

  5. Android学习笔记---22_访问通信录中的联系人和添加联系人,使用事物添加联系人...

    Android学习笔记---22_访问通信录中的联系人和添加联系

  6. 华为HCIA-datacom 学习笔记18——SDN与NFV概述

    华为HCIA-datacom 学习笔记18--SDN与NFV概述 SDN与NFV概述 1.计算机时代的演进 1.1大型机 专门的硬件 专门的操作系统 专门的应用.(稳定性能好,但封闭) 1.2小型机 ...

  7. Python3学习笔记之-学习基础(第三篇)

    Python3学习笔记之-学习基础(第三篇) 文章目录 目录 Python3学习笔记之-学习基础(第三篇) 文章目录 一.循环 1.for循环 2.while循环 3.break,continue 二 ...

  8. 2020-4-12 深度学习笔记18 - 直面配分函数 5 ( 去噪得分匹配,噪声对比估计NCE--绕开配分函数,估计配分函数)

    第十八章 直面配分函数 Confronting the Partition Function 中文 英文 2020-4-8 深度学习笔记18 - 直面配分函数 1 ( 配分函数概念,对数似然梯度) 2 ...

  9. A Byte of Python3 学习笔记

    A Byte of Python3 学习笔记 第七章 控制流 1.if语句(带输入函数) 2.while语句 3.for循环 4.break.continue.return的区别 第八章 函数 8.1 ...

  10. Python3 学习笔记

    Python3 学习笔记 1.基础语法 1.1 字符串操作 title() 将单词首字母改为大写 upper() 所有字母改为大写 lower() 所有字母改为小写 str1+str2 字符串通过'+ ...

最新文章

  1. int main( int argc , char *argv[] , char *envp[] )中参数解说
  2. 另一种同步软件Unison的使用方法
  3. 2090. 「ZJOI2016」旅行者 分治,最短路
  4. Arm架构下VUE环境的安装
  5. C语言for循环的嵌套例题,c语言 for循环的嵌套(含答案)
  6. C++ 现代编程风格速查表
  7. 第一:Pycharm安装(非常详细)
  8. 数十亿个 Wi-Fi 设备存在缺陷,通信易被窃听!
  9. 【等价转换】—— min/max 的转换与互相转换
  10. MATLAB入门教程(3):数组的创建与使用
  11. 2019年ACM大赛:北大清华无缘前十,莫斯科大学第一
  12. yansongda 支付宝提现,商家转账
  13. 看我如何用云函数撸一个PC小程序代码包在线解密工具
  14. Oracle数据库管理系统(安装及入门教学)
  15. https证书怎么申请?
  16. java基于sptingboot+vue的校园疫情防控系统 elementui
  17. PAT 甲级1121 Damn Single
  18. 超哥笔记--shell 基本命令(4)
  19. Android 性能优化必知必会
  20. Opencv读取网络摄像头的rtsp流

热门文章

  1. 读《单页web应用》-回顾作用域
  2. 【bzoj1593-预定旅馆】线段树维护连续区间
  3. HTML图片热点及表单
  4. 硬盘安装Windows需要了解的DOS命令
  5. IOS之Core Foundation框架和Cocoa Foundation框架的区别
  6. 笔记:Hadoop权威指南 第9章 构建Hadoop集群
  7. 使用Emit创建DBContext对象
  8. java中普通变量、静态变量、静态代码块初始化的顺序辨析
  9. iphone 内部函数使用 (函数可能无法响应的部分解决方案)
  10. 为什么开发移动端web不使用jQuery