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 相关文章推荐
写了个监控nginx进程的Python脚本
May 10 Python
python实现的守护进程(Daemon)用法实例
Jun 02 Python
python 快速把超大txt文件转存为csv的实例
Oct 26 Python
Python直接赋值、浅拷贝与深度拷贝实例分析
Jun 18 Python
anaconda中更改python版本的方法步骤
Jul 14 Python
python中dict使用方法详解
Jul 17 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
Python time库基本使用方法分析
Dec 13 Python
python编写俄罗斯方块
Mar 13 Python
python 模拟在天空中放风筝的示例代码
Apr 21 Python
教你用Python matplotlib库制作简单的动画
Jun 11 Python
python使用matplotlib绘制图片时x轴的刻度处理
Aug 30 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 已经成熟
2006/12/04 PHP
PHP文件上传实例详解!!!
2007/01/02 PHP
php文件夹与文件目录操作函数介绍
2013/09/09 PHP
php 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
浅谈php的优缺点
2015/07/14 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
对 lightbox JS 图片控件进行了一下改造, 使其他支持复杂的图片说明
2010/03/20 Javascript
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
JavaScript高级程序设计 阅读笔记(十二) js内置对象Math
2012/08/14 Javascript
JavaScript bold方法入门实例(把指定文字显示为粗体)
2014/10/17 Javascript
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
Bootstrap 3 按钮标签实例代码
2017/02/21 Javascript
深入理解Webpack 中路径的配置
2017/06/17 Javascript
vue-cli项目中怎么使用mock数据
2017/09/27 Javascript
web前端vue filter 过滤器
2018/01/12 Javascript
VUE 使用中踩过的坑
2018/02/08 Javascript
Vue中使用的EventBus有生命周期
2018/07/12 Javascript
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
[01:28]国服启动器接入蒸汽平台操作流程视频
2021/03/11 DOTA
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
使用apidocJs快速生成在线文档的实例讲解
2018/02/07 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
scrapy头部修改的方法详解
2020/12/06 Python
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
Steve Madden官网:美国鞋类品牌
2017/01/29 全球购物
JACK & JONES英国官方网站:欧洲领先的男装生产商
2017/09/27 全球购物
红色连衣裙精品店:Red Dress Boutique
2018/08/11 全球购物
为什么在使用动态 SQL 语句时必须为低层数据库对象授予权限
2012/12/13 面试题
纪检干部个人对照检查材料
2014/09/23 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
JavaScript数组 几个常用方法总结
2021/11/11 Javascript