Python中 _ 和 __ 的含义

_ 的含义

在python的类中,没有真正的私有化,不管是方法还是属性,为了编程的需要,约定加了下划线 _ 的属性和方法不属于API,不应该在类的外面访问,也不会被from M import * 导入。下面的代码演示加了_ 的方法,以及在类外面对其的可访问性。

class A:def _method(self):print('约定为不在类的外面直接调用这个方法,但是也可以调用')def method(self):return self._method()
a = A()

在类A中定义了一个_method方法,按照约定是不能在类外面直接调用它的,为了可以在外面使用_method方法,又定义了method方法,method方法调用_method方法。请看代码演示:

In [24]: a.method()
不建议在类的外面直接调用这个方法,但是也可以调用

但是我们应该记住的是加了_的方法也可以在类外面调用:

In [25]: a._method()
不建议在类的外面直接调用这个方法,但是也可以调用

__ 的含义

python中的__和一项称为name mangling的技术有关,name mangling (又叫name decoration命名修饰).在很多现代编程语言中,这一技术用来解决需要唯一名称而引起的问题,比如命名冲突/重载等. [ 维基百科 ]

代码演示如下:

------------------------------------------------------------------
[ --注:我这有个学习基地,里面有很多学习资料,感兴趣的+Q群:895817687]
------------------------------------------------------------------
class A:def __method(self):print('This is a method from class A')def method(self):return self.__method()class B(A):def __method(self):print('This is a method from calss B')

在类A中,__method方法其实由于name mangling技术的原因,变成了_A__method,所以在A中method方法返回的是_A__method,B作为A的子类,只重写了__method方法,并没有重写method方法,所以调用B中的method方法时,调用的还是_A__method方法:

In [27]: a = A()In [28]: b = B()In [29]: a.method()
This is a method from class AIn [30]: b.method()
This is a method from class A

在A中没有__method方法,有的只是_A__method方法,也可以在外面直接调用,所以python中没有真正的私有化:

--------------------------------------------------------------------
[ --注:我这有个学习基地,里面有很多学习资料,感兴趣的+Q群:895817687]
--------------------------------------------------------------------In [35]: a.__method()AttributeError                            Traceback (most recent call last)
<ipython-input-35-b8e0b1bf4d09> in <module>()
----> 1 a.__method()AttributeError: 'A' object has no attribute '__method'In [36]: a._A__method()
This is a method from class A

在B中重写method方法:

class B(A):def __method(self):print('This is a method from calss B')def method(self):return self.__method()

现在B中的method方法会调用_B__method方法:

In [32]: b = B()In [33]: b.method()
This is a method from calss B

总结

python中没有真正的私有化,但是有一些和命名有关的约定,来让编程人员处理一些需要私有化的情况。

轻松理解python中的_和__区别和含义相关推荐

  1. python中的_和__

    Python中 _ 和 __ 的含义 _ 的含义 在python的类中,没有真正的私有化,不管是方法还是属性,为了编程的需要,约定加了下划线 _ 的属性和方法不属于API,不应该在类的外面访问,也不会 ...

  2. 彻底理解Python中浅拷贝和深拷贝的区别

    目录 前言 1. 浅拷贝和深拷贝的概念 2. is和==的区别 3. 赋值操作 4. copy模块里面的copy()方法 5. copy模块里面的deepcopy()方法 6.字典自带的copy方法 ...

  3. python中的remove是什么意思_小白理解python中remove与del 的区别

    leetcode中的题目,感觉之前不太理解,就记录下来了. 题目:移动零,给定一个数组 nums, 编写一个函数将所有 0 移动到它的末尾,同时保持非零元素的相对顺序(Python3 环境). 例如: ...

  4. python iterable对象_如何理解Python中的iterable对象

    转载请注明出处:https://www.jianshu.com/u/5e6f798c903a [^*] 表示注脚,在文末可以查看对应连接,但简书不支持该语法. 首先,容器和 iterable 间没有必 ...

  5. python的上下文管理用哪个关键字_正确理解python中的关键字“with”与上下文管理器...

    正确理解python中的关键字"with"与上下文管理器 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  正确理解python中的关键字&quo ...

  6. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

    python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...

  7. python中元组_理解python中的元组

    理解 python 中的元组 引言 在 Python 中元组是这样的: 元组是是这样一种数据结构:不变的或者不可改变的(简单来说不能重新赋值) .元素的有序序列.因为元组是 不变的,所以他的数值是不能 ...

  8. python中继承是什么意思_如何理解Python中的继承?python入门

    如何理解Python中的继承?如今,python编程语言深受企业和个人的喜爱.python开发工程师是近年来互联网行业非常热门的职业岗位之一.学习python的人除了零基础的,还有一部分是在职运维.在 ...

  9. pythonself用法_全面理解python中self的用法

    self代表类的实例,而非类. classTest:defprt(self):print(self)print(self.__class__) t=Test() t.prt() 执行结果如下 从上面的 ...

最新文章

  1. AOV网拓扑排序(c/c++)
  2. Java Review - LinkedHashMap LinkedHashSet 源码解读
  3. Statement, PreparedStatement和CallableStatement的区别
  4. 【352天】我爱刷题系列111(2018.01.23)
  5. [渝粤教育] 中国地质大学 信息管理概论 复习题
  6. 掼蛋游戏WEB版——PHP后台实现源码
  7. java怎么将图片文件转流并在jsp前端显示_jsp已经被淘汰了吗?
  8. 怎么样向云服务器上传文件_如何向云服务器传输文件
  9. lazarus控件怎么那么少_盘点5个常被搞混的控件与规范
  10. AngularJS源码解析2:注入器的详解
  11. linux中权限减少,Linux中权限管理
  12. vue可视化拖拽生成工具_GitHub - 1260215278/dragUI: 基于vuedraggable.js + uni 的可视化拖拽编程,自动生成项目,自动生成代码,自行导入第三方组件...
  13. Linux嵌入式开发_主设备号与次设备号详解
  14. 本地图片预览代码(支持 IE6、IE7)
  15. 拿下最佳论文、世界第一,这个团队过去一年真的牛
  16. Struts2之入门
  17. 经典面试智力题200+题和解答
  18. Python数据分析报告
  19. 服务器虚拟化cas,CAS虚拟化建设方案
  20. Pandas库的基本使用方法

热门文章

  1. 十大经典排序算法之希尔排序及其优化
  2. Transformation
  3. linux运行脚本文件python,Python脚本:Linux自动化执行Python脚本
  4. 【学习笔记】redis一些配置文件参数详解
  5. MySQL学习笔记02【SQL基本概念与通用语法、数据库的CRUD操作】
  6. Android【FileInputStream、FileOutputStream---本地文件I/O操作-读写操作模板(btnWrite方法、btnRead方法)】
  7. Kotlin实战指南七:单例模式
  8. Android 获取系统语言(兼容7.0)
  9. 实验吧——SQL注入 Write up(一)
  10. Windows8.1 64bit环境下搭建深度学习平台之CUDA安装与配置