回顾

在Python进阶记录之基础篇(十五)中,我们介绍了面向对象的基本概念以及Python中类和对象的基础知识,需要重点掌握类的创建和对象的使用。今天我们继续讲一下Python中面向对象的相关知识点——属性的访问限制。

属性的种类

通过之前的内容,我们知道,在定义一个类时,类内部可以有属性和方法。我们仍然创建一个学生类Student。

Student类

定义好一个类后,我们就可以在类的外部通过生成对象来使用对象的实例变量或调用成员方法来操作数据,从而隐藏类内部的代码逻辑。但是,从类Student的定义来看,在类的外部,我们依然可以通过“对象.属性”的方式对属性进行任意修改。

修改属性

上述代码中,我们在类的外部生成了一个对象student1,通过student1.name的方式将name修改为CCC,student1的name属性就被修改了。然而,在面向对象编程中,我们往往不希望类内部的属性被类外部的代码直接修改和访问,因此,私有变量的概念应运而生了。

私有变量顾名思义是私有的,类的私有变量只允许类内部代码操作。Python中,私有变量就是在属性开头加两个下划线“__”。

私有变量

可以看到,一旦将属性设置为私有变量,如果我们试图通过“对象.私有变量”来直接访问的话,Python就会报错了。

Python中,类的属性可以分为公有变量和私有变量两种,公有变量允许类的外部代码通过“对象.属性”的方式直接进行修改和获取,而私有变量则不允许外部代码直接访问。其中,私有变量的命名以两个下划线“__”开头。

需要注意的是,Python中变量名类似__xxx__的,也就是以双下划线开头,并以双下划线结尾的变量不属于私有变量,因此,我们不能使用类似__name__这样的变量名作为私有变量。

在开发过程中,我们有时会碰到以一个下划线开头的实例变量名,比如_age。

单下划线开头的实例变量

从上述代码中我们可以看到,以一个下划线开头的实例变量是可以直接在类的外部代码中通过“对象.属性”的方式进行访问的。但是,Python中有个约定俗成的规定,如果你看到别人的代码中使用了这种以一个下划线开头的实例变量,那么你应该把它当做私有变量,不要直接在外部代码中进行访问。

私有变量的访问

在定义类的时候,如果把属性设置成私有变量,就不能在类的外部代码中直接访问了。上述代码中,如果我们想要修改或获取私有变量__name,我们可以通过给Student类创建成员方法get_name( )和set_name( )来对__name进行获取和修改。

成员方法set/get

有了get_name( )方法和set_name( )方法后,我们就可以通过对象调用成员方法来对私有变量__name进行访问了。或许看到这里,你会有这样的疑问:通过“对象.属性”的方式也可以对属性进行修改和获取,为什么一定要设置成私有变量呢?除了封装性上的要求外,使用成员方法还可以给修改设置限制。

设置修改限制

上述代码中,我们将学生的年龄限制在10~40之间。此时,若外部代码试图用一个不在此范围内的年龄进行修改时,就会修改失败。通过成员方法修改私有变量可以对传入的参数进行校验,避免传入无效的参数。

如果你刚刚在设置私有变量__name的时候试过在外部代码中使用“对象.__name = 值”的方式,你会发现Python并没有报错,甚至在赋值后可以使用“print(对象.__name)”获取到__name的值。实际上,你用上述方式操作的__name并不是定义类时的那个私有变量__name,我们看一下以下代码。

对象绑定实例变量

可以看到,虽然通过“对象.属性”的方式我们修改了一个叫__name的变量,但当我们调用get_name( )方法的时候,私有变量__name的值并没有被修改。这是因为,Python允许对象绑定任意属性,student1.__name操作的__name只是新绑定的一个属性而已,它和定义类时定义的私有变量__name虽然名字相同,却是两个不同的变量。

那么私有变量是不是一定不能从外部访问呢?在Python中,我们之所以不能直接访问私有变量__name,是因为Python解释器对外把__name变量改成了_Student__name。换句话说,其实我们是可以通过“_类名+私有变量名”的方式来直接访问私有变量的。

私有变量的变向直接访问

虽然我们可以通过这种变相的方式直接访问私有变量,但是在实际开发中,我们基本上是抵制这种写法的,因为不同版本的Python解释器可能会把私有变量改成不同的变量名。

总结

以上内容介绍了Python面向对象中关于属性的访问限制,当然我们对这个限制是要加引号的,因为Python中并没有任何阻止机制对属性的访问进行限制,但是我们仍然需要自觉遵守这些约定俗成的规定,这也是面向对象编程所要求的。感谢大家的支持与关注,欢迎一起学习交流~

python进阶记录之基础篇二十六_Python进阶记录之基础篇(十六)相关推荐

  1. python中字典的键是唯一的吗_python 零散记录(四) 强调字典中的键值唯一性 字典的一些常用方法...

    dict中键只有在值和类型完全相同的时候才视为一个键: mydict = {1:1,'':1} #此时mydict[1] 与 mydict['1']是两个不同的键值 dict的一些常用方法: clea ...

  2. python程序设计从基础到开发课后题答案夏敏捷_[转载] python程序设计应用教程夏敏捷答案第八章_Python程序设计:从基础到开发...

    参考链接: 用Python设计键盘记录器 基础篇 第1章Python语言介绍 1.1Python语言简介 1.2安装与配置Python环境 1.2.1安装Python 1.2.2运行Python 1. ...

  3. python创建一个n*m的二维数组_Python中创建二维数组

    Python中创建二维数组 二维数组 二维数组本质上是以数组作为数组元素的数组,即"数组的数组",类型说明符 数组名[常量表达式][常量表达式].二维数组又称为矩阵,行列数相等的矩 ...

  4. python怎么由列表生成m*n的矩阵_Python进阶系列:Python遍历的秘密

    前言 可迭代对象,迭代器,生成器,相信许多学习Python的小伙伴或多或少都听说过,但你真的知道他们的区别吗?真的知道为什么需要这些概念吗? 本文带你深入了解一系列相关机制,不仅告诉你概念,还告诉你为 ...

  5. python内置函数返回序列中最大元素_Python之路(第八篇)Python内置函数、zip()、max()、min()...

    一.python内置函数 abs() 求绝对值 例子 print(abs(-2)) all() 把序列中每一个元素做布尔运算,如果全部都是true,就返回true, 但是如果是空字符串.空列表也返回t ...

  6. python元组和列表都支持的方法是_Python进阶1-元组和列表

    本系列文章是一系列学习笔记,希望较为深入地分析Python3中的原理.性能,文章中绝大部分观点都是原作作者的观点(如下),本人对书中示例加以实践和总结,并结合相应的Python的C语言源码(3.6.1 ...

  7. 【Java基础】二、大厂都开始重视的基础很重要吗?快来加入基础的学习,巩固一下细枝末角,刷刷面试题吧

    2_变量.标识符.保留字.变量 一.关键字与保留字 1.关键字(keyword)的定义和特点 2.保留字(reserved word) 二.标识符 1.什么是标识符(Identifier) 2.定义合 ...

  8. python输出字符串的格式控制千分位分隔符_Python 随身听-巩固基础-字符串格式化的几种套路...

    Python 随身听-巩固基础-字符串格式化的几种套路 前段日子,解读官方文档时,我们已经看过了官方文档里面的一些字符串的常用格式化方法Python权威学习资料-官方文档-DE8UG解读-07-输入输 ...

  9. python基础知识笔记简书_Python学习笔记01——基础知识

    Python常用数据类型: 整数(int),浮点数(float),字符串(str) 布尔型(True,False),空值(None) 列表(list):一种有序集合,可以随时添加删除其中的元素. cl ...

最新文章

  1. 【数学建模】图论模型-dijkstra算法(最优化)
  2. 1011:甲流疫情死亡率
  3. 多麦克风做拾音的波束_麦克风阵列是什么 有哪些关键技术?
  4. Cannot get a connection, pool exhausted, cause: ValidateObject failed
  5. python 基础干货 01
  6. 别乎略安身立命的基础本领
  7. python制作印刷体数据集:数字符号数据集(字符串转图片)
  8. 大数据分析有哪些特征
  9. 数据访问优化性能(转载)
  10. opencv画框显示python_Python OpenCV实现鼠标画框效果
  11. iOS--利用Fastlane实现自动化打包
  12. 记第一次FPV模式飞行穿越机的感受
  13. VMware Esxi7.0.3f集成最新网卡-v2(2022年7月版)
  14. 向量叉积和点积混合运算_叉乘点乘混合运算公式
  15. 电容上电后是短路还是开路?
  16. H3C防火墙-安全域
  17. C语言实现哈夫曼树求解及其编码输出
  18. [转载] 七龙珠第一部——第008话 龟仙人的龟派气功波
  19. Thinkphp实现超级漂亮实用的淘宝客平台源码
  20. 《缠中说禅108课》80:市场没有同情、不信眼泪

热门文章

  1. CloudFoundry命令行安装和卸载插件
  2. Edit button clicked in offline mode
  3. /UI2/CL_NWBC_RUNTIME35 - GET_ROLES
  4. request download - 两个队列的研究
  5. how Machine Learning service is used in Jeans project
  6. CRM里用户状态和系统状态的区别
  7. an example of Ascii using 问号 as example
  8. SAP CRM里note界面默认语言的决定逻辑
  9. SAP CRM呼叫中心end按钮的实现逻辑
  10. Docker镜像提交命令commit的工作原理和使用方法