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第八周:详解网络编程基础(socket)
Dec 14 Python
Python2.7编程中SQLite3基本操作方法示例
Aug 09 Python
Python BS4库的安装与使用详解
Aug 08 Python
python matplotlib库绘制散点图例题解析
Aug 10 Python
springboot配置文件抽离 git管理统 配置中心详解
Sep 02 Python
使用pytorch实现可视化中间层的结果
Dec 30 Python
Python 解码Base64 得到码流格式文本实例
Jan 09 Python
Python代码一键转Jar包及Java调用Python新姿势
Mar 10 Python
python 画条形图(柱状图)实例
Apr 24 Python
浅谈django不使用restframework自定义接口与使用的区别
Jul 15 Python
Django怎么在admin后台注册数据库表
Nov 14 Python
python实战之用emoji表情生成文字
May 08 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
如何删除多级目录
2006/10/09 PHP
PHP开发中的错误收集,不定期更新。
2011/02/03 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
2013/07/01 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
2014/04/17 PHP
php计算2个日期的差值函数分享
2015/02/02 PHP
php遍历目录方法小结
2015/03/10 PHP
非常全面的php日期时间运算汇总
2015/11/04 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
PHP开发实现快递查询功能详解
2019/04/08 PHP
php链式操作的实现方式分析
2019/08/12 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
用javascript获得地址栏参数的两种方法
2006/11/08 Javascript
JavaScript 检测浏览器和操作系统的脚本
2008/12/26 Javascript
jquery tools 系列 scrollable学习
2009/09/06 Javascript
使用javascript实现简单的选项卡切换
2015/01/09 Javascript
jQuery实现DIV层收缩展开的方法
2015/02/27 Javascript
学习使用bootstrap基本控件(table、form、button)
2016/04/12 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
2017/12/29 Javascript
vue单页应用加百度统计代码(亲测有效)
2018/01/31 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
小程序接口的promise化的实现方法
2019/12/11 Javascript
JS如何操作DOM基于表格动态展示数据
2020/10/15 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
Python中的集合类型知识讲解
2015/08/19 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
2020/04/17 Python
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
C#中有没有运算符重载?能否使用指针?
2014/05/05 面试题
信息工程学院毕业生推荐信
2013/11/05 职场文书
预备党员思想汇报范文
2013/12/29 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
劳保用品管理制度范本
2015/08/06 职场文书
五一放假通知怎么写
2015/08/18 职场文书
初二数学教学反思
2016/02/17 职场文书