回顾

在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做爬虫下载视频

    用python有一段时间了,对python是十二分喜爱,在我看来python是个好工具,可以轻松简洁的帮我完成一些我想要完成的工作.下面和大家分享一下我用python爬取某网站视频的案例.用pytho ...

  2. 怎么用python下载视频_使用Python从直接URL下载视频

    我想用 python下载视频.我尝试使用youtube-dl,但不支持我想从中下载视频的网站.如何在 Python中下载视频.首先,我尝试在关注此链接 http://www.kmcgraphics.c ...

  3. python 微信视频_基于Python快速整理微信视频与图片

    photoes.jpg 作为超级APP,微信已经成了移动互联网的入口.而我们也早已习惯通过微信收发图片与视频等多媒体文件.身为一名屌丝通信狗,经常出差海外,跟家人的沟通方式主要就靠微信了,每当累了或抑 ...

  4. 如何用python爬视频_使用Python爬取视频

    说明:本实例可从视频网站爬取相关视频碎片,最后拼接成一个完整的视频,可以是vip视频. 步骤1:打开某个视频页面,如腾讯视频<一出好戏>(地址:https://v.qq.com/x/cov ...

  5. win7安装python教程视频_二级Python视频教学教程_因材考试网 - Win7之家

    至今,黑莓和诺基亚一样,经常仍被拿出来当做手机行业的经典反面案例. 在软件方面,微软还将发布 Windows 10的两个新功能更新,并将继续在移动应用程序上进行投资,特别是在Android上,该公司已 ...

  6. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  7. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  8. python教程视频完整版-Python教程视频完整版

    原标题:Python教程视频完整版 Python是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的.随着人工智能的发展,Python这门语言也 ...

  9. python教程视频哪个好-Python入门视频哪个好?

    Python入门视频哪个好?假设你希望学习Python这门语言,却苦于找不到一个简短而全面的入门教程,那么这些Python入门教程将带你走入Python的大门.如果你希望真正学好一门语言,你还是需要亲 ...

最新文章

  1. python-判断语句介绍
  2. github Git 原理简介
  3. android恶意代码检测报告,用机器学习检测Android恶意代码
  4. SQL server判断字符串是否包含某个字符串
  5. FPGA经验分享——时序收敛之路
  6. C# 捕获系统闪退BUG
  7. Oracle中SQL语句学习五(统计分组语句group by和having)
  8. php简单生成缩略图方法
  9. 使用web进行数据库管理
  10. mysql 表与表之间的条件比对_十六年老司机笔记:MySQL性能优化之必备技能
  11. Java开发工具IntelliJ IDEA创建Andriod项目示例说明
  12. 用matlab画旋转抛物面_MAELAB (1)画出旋转抛物面z=x^2 y^2 编程(2)matlab 画出锥面z=(x^2+y^2)^(1/2)编程...
  13. pcm5102a解码芯片音质评测_音乐更重要,iQOO Pro配备独立解码芯片,Hi-Fi音质更懂你...
  14. ktv点歌系统服务器怎样连接,ktv设备与显示屏怎么连接
  15. oracle函数整理---first_value函数
  16. CIDR表示IP地址
  17. 框架源码系列九:依赖注入DI、三种Bean配置方式的注册和实例化过程
  18. 深度解析ConcurrentHashMap
  19. 物联网通信技术原理第5章 移动通信技术
  20. 前程无忧网站,职位信息一步到位函数爬取!!!真一步到位

热门文章

  1. Django 系列博客(十一)
  2. 第一个ExtJS练习(添加用户面板)
  3. 技术专题之-技术概述的目录
  4. android style 与theme的区别
  5. [转]MFC中ON_COMMAND, ON_MESSAGE, ON_NOTIFY它们的区别
  6. [转载] python3基础语法(注释、缩进)_1.02
  7. [转载] 令牌桶算法和漏桶算法python_排序算法(七):Bucket Sort 桶排序
  8. [转载] python基础 - namedtuple和enum
  9. 2019.7.19刷题统计
  10. Oracle:lsnrctl start Timeout or Adapter error