在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。

class Student(object):def __init__(self, name, score):self.__name = nameself.__score = scoredef print_score(self):print('%s: %s' % (self.__name, self.__score))
bar = Student("Mike",90)
print(bar.__name)

输出:

Traceback (most recent call last):File "E:/ru/231n/exer.py", line 11, in <module>print(bar.__name)
AttributeError: 'Student' object has no attribute '__name'

这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。

如果外部代码要获取name和score,可以给Student类增加get_nameget_score这样的方法:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def get_name(self):return self.__namedef get_score(self):return self.__score

如果又要允许外部代码修改score,可以再给Student类增加set_score方法:

def set_score(self, score):self.__score = score

双下划线开头的实例变量也不是一定不能从外部访问不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量:

print(bar._Student__name) #Mike

需要注意的是,在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量。

以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

注意避免下面的错误:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
bar.__name = "Tom"
print(bar.__name) #Tom
print(bar.get_name()) #Mike

表面上看,外部代码“成功”地设置了__name变量,但实际上这个__name变量和class内部的__name变量不是一个变量!内部的__name变量已经被Python解释器自动改成了_Student__name,而外部代码给bart新增了一个__name变量。

python 面向对象教程:访问限制相关推荐

  1. python控制视频_控制Python面向对象的访问

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

  2. python面向对象教程_Python入门系列教程3-面向对象

    课程咨询.获取课件.技术交流直接加入博学谷在线学习:631731828 课程简介 本课程是Python系列入门课程的第三阶段,该阶段我们会学习面向对象(OOP)这一重要的编程思想.学习的知识点主要包括 ...

  3. Python面向对象之访问限制

    为什么要做访问限制, 做访问限制,是为了程序的健壮性.如果可以从外部对函数里面重要的属性进行任意修改,有可能程序崩溃只是因为一次不经意地参数修改. 通过定义私有属性做访问限制 默认情况下,可从外部访问 ...

  4. python多态_Python面向对象教程之多态

    今天给大家介绍面向对象最后一个重要的特性--多态.如果想温习前两个重要特性(继承和封装),可以点开:<Python面向对象教程之基本概念>.<Python面向对象教程之单继承> ...

  5. python基础系列教程——python面向对象编程全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 python面向对象编程全解. 面向对象技术简介 一个类占有一个独立的空间,类中的属性叫做类变量,类中的函数,叫做类的方法. 类(Class) ...

  6. python面向对象类创建人物类包含姓名、职业_Python面向对象思想与应用入门教程【类与对象】...

    本文实例讲述了Python面向对象思想与应用.分享给大家供大家参考,具体如下: 面向对象思想 1.面向对象的设计思想 面向对象是基于万物皆对象这个哲学观点. 2.面向对象和面向过程的区别 面向过程 在 ...

  7. Python基础教程(九):面向对象、正则表达式

    Python 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触过 ...

  8. python面向对象编程指南([美stevenflott_Python面向对象编程指南 ([美]StevenFLott洛特) 中文_IT教程网...

    资源截图:Python面向对象编程指南 ([美]StevenFLott洛特) 中文 第1部分 用特殊方法实现Python风格的类 . 1 第1章 __init__()方法 5 第2章 与Python无 ...

  9. 可能是最全的 Python 面向对象入门教程了

    作者:浪子燕青 http://www.langzi.fun/Python面向对象编程.html 面向对象编程和函数式编程(面向过程编程)都是程序设计的方法,不过稍有区别. 面向过程编程: 1. 导入各 ...

最新文章

  1. 忍不住要发感慨,我的这个罗技鼠真好用...
  2. Android——APK 在32bit/64bit平台 动态库问题
  3. P11 非线性系统-《Matlab/Simulink与控制系统仿真》程序指令总结
  4. ES6, Angular,React和ABAP中的String Template(字符串模板)
  5. 图论--网络流最大流问题
  6. 跟我学 Java 8 新特性之 Stream 流(二)关键知识点
  7. s2sh框架搭建mysql_S2SH项目框架搭建(完全注解)
  8. bouncing-balls-evil-circle
  9. vue 第四天 (计算属性的使用)
  10. 【LeetCode】【数组】题号:*118,杨辉三角
  11. 2ask信号调制与解调 matlab,2ASK2ASK调制与解调系统的MATLAB实现及性能分析
  12. Dell(戴尔)Alienware(外星人)Alienware Command Center(AWCC)更新失败解决方案(究极版)
  13. is_enabled:selenium中判断元素是否可以使用;is_selected()/is_displayed()
  14. Alink漫谈(十一) :线性回归 之 L-BFGS优化
  15. c语言绝对值大小并输出原值,c语言中绝对值大小的比较
  16. Xcode No account for team . Add a new account in the Accounts preference pane or verify
  17. LA 4670 Dominating Patterns AC自动机简单题
  18. PTX-NPs 纳米粒子修饰紫杉醇/与桦木酸PEG/邻硝基苯丙酸紫杉醇偶联物的制备
  19. 完整的OpenDDS的发布订阅编写及源码(Windows)
  20. 利用计算机对多媒体进行综合处理,多媒体技术复习题及答案

热门文章

  1. 本地yum仓库和http方式的yum仓库。
  2. 【转】Java 内存模型及GC原理
  3. iOS自定义的UISwitch按钮
  4. Tengine ngx_http_sysguard_module 过载保护模块使用
  5. 场效应晶体管内存 到底是谁发明的?
  6. 手势识别兼容Android 1.x和2.x的代码【转】
  7. 一步一步教你写带图片注释的淡入淡出插件(三)
  8. 【PP操作手册】工艺路线相关操作
  9. 销售单据条件价格明细表
  10. 数据列过滤条件常用处理