Python3中_(下划线)和__(双下划线)的用途和区别


Posted in Python onApril 26, 2019

在看一些Python开源代码时,经常会看到以下划线或者双下划线开头的方法或者属性,到底它们有什么作用,又有什么样的区别呢?今天我们来总结一下(注:下文中的代码在Python3下测试通过)

_ 的含义

在python的类中没有真正的私有属性或方法,没有真正的私有化。

但为了编程的需要,我们常常需要区分私有方法和共有方法以方便管理和调用。那么在Python中如何做呢?

一般Python约定加了下划线 _ 的属性和方法为私有方法或属性,以提示该属性和方法不应在外部调用,也不会被from ModuleA import * 导入。如果真的调用了也不会出错,但不符合规范。

下面的代码演示加了_ 的方法,以及在类外面对其的可访问性。

class TestA:
  def _method(self):
    print('I am a private function.')
  def method(self):
    return self._method()
ca = TestA()
ca.method()

输出:

I am a private function.

在类TestA中定义了一个_method方法,按照约定是不能在类外面直接调用它的,为了可以在外面使用_method方法,又定义了method方法,method方法调用_method方法。

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

ca._method()

输出:

I am a private function.

__ 的含义

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

Python中双下划线开头,是为了不让子类重写该属性方法.通过类的实例化时自动转换,在类中的双下划线开头的属性方法前加上”_类名”实现.

class TestA:
  def __method(self):
    print('This is a method from class TestA')
  def method(self):
    return self.__method()
class TestB(TestA):
  def __method(self):
    print('This is a method from calss TestB')
ca = TestA()
cb = TestB()
ca.method()
cb.method()

输出结果:

This is a method from class TestA
This is a method from class TestB

在类TestA中,__method方法其实由于name mangling技术的原因,自动转换成了_TestA__method,所以在A中method方法返回的是_TestA__method,TestB作为TestA的子类,只重写了__method方法,并没有重写method方法,所以调用B中的method方法时,调用的还是_TestA__method方法。

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

不能直接调用__method()方法, 需要调用转换之后的方法

ca.__method()

输出:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'TestA' object has no attribute '__method'

转换后的方法名为:_TestA__method

ca._TestA__method()

输出:

This is a method from class TestA

在TestB中重写method方法:

class TestB(TestA):
  def __method(self):
    print('This is a method from calss TestB')
  def method(self):
    return self.__method()
cb = B()
cb.method()

输出:

This is a method from calss TestB

现在TestB中的method方法会调用_TestB__method方法:

1、_xxx 不能用于'from module import *' 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。

2、__xxx 双下划线的表示的是私有类型的变量。只能是允许这个类本身进行访问了。连子类也不可以

3、__xxx___ 定义的是特列方法。像__init__之类的

总结

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现封装得到virustotal扫描结果
Oct 05 Python
Python的类实例属性访问规则探讨
Jan 30 Python
python魔法方法-属性转换和类的表示详解
Jul 22 Python
Python zip()函数用法实例分析
Mar 17 Python
Python中将变量按行写入txt文本中的方法
Apr 03 Python
Python爬虫抓取代理IP并检验可用性的实例
May 07 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 Python
matplotlib 生成的图像中无法显示中文字符的解决方法
Jun 10 Python
python实现图片素描效果
Sep 26 Python
几款Python编译器比较与推荐(小结)
Oct 15 Python
python实现控制台输出颜色
Mar 02 Python
python实现高效的遗传算法
Apr 07 Python
详解Python爬取并下载《电影天堂》3千多部电影
Apr 26 #Python
Python 2/3下处理cjk编码的zip文件的方法
Apr 26 #Python
实例详解Matlab 与 Python 的区别
Apr 26 #Python
Python生成MD5值的两种方法实例分析
Apr 26 #Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
Apr 26 #Python
Python生成rsa密钥对操作示例
Apr 26 #Python
python利用Opencv实现人脸识别功能
Apr 25 #Python
You might like
php adodb连接不同数据库
2009/03/19 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
2012/10/06 PHP
zf框架的Filter过滤器使用示例
2014/03/13 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
php实现简单的语法高亮函数实例分析
2015/04/27 PHP
如何使用php等比例缩放图片
2016/10/12 PHP
浅析PHP开发规范
2018/02/05 PHP
javascript入门·对象属性方法大总结
2007/10/01 Javascript
Prototype ObjectRange对象学习
2009/07/19 Javascript
jquery打开直接跳到网页最下面、最低端实现代码
2013/04/22 Javascript
js正则表达式的使用详解
2013/07/09 Javascript
JS关闭窗口与JS关闭页面的几种方法小结
2013/12/17 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
JavaScript实现带箭头标识的多级下拉菜单效果
2015/08/27 Javascript
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
深入理解node exports和module.exports区别
2016/06/01 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
js实现无缝滚动图(可控制当前滚动的方向)
2017/02/22 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
2017/02/23 Javascript
node.js基于express使用websocket的方法
2017/11/09 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
用Python制作在地图上模拟瘟疫扩散的Gif图
2015/03/31 Python
Python中最常用的操作列表的几种方法归纳
2015/04/24 Python
详解在Python和IPython中使用Docker
2015/04/28 Python
python实现键盘输入的实操方法
2019/07/16 Python
python 处理微信对账单数据的实例代码
2019/07/19 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
如何通过Python实现RabbitMQ延迟队列
2020/11/28 Python
纯CSS和jQuery实现的在页面顶部显示的进度条效果2例(仿手机浏览器进度条效果)
2014/04/16 HTML / CSS
产品质量承诺书
2014/03/27 职场文书
企业党建工作汇报材料
2014/08/19 职场文书
个性与发展自我评价
2015/03/06 职场文书
校长一岗双责责任书
2015/05/09 职场文书
致运动员加油稿
2015/07/21 职场文书
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers