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 相关文章推荐
在Django的模型中添加自定义方法的示例
Jul 21 Python
Python3实现的画图及加载图片动画效果示例
Jan 19 Python
利用Python实现在同一网络中的本地文件共享方法
Jun 04 Python
Python解析Excle文件中的数据方法
Oct 23 Python
python设定并获取socket超时时间的方法
Jan 12 Python
网易2016研发工程师编程题 奖学金(python)
Jun 19 Python
对Pytorch神经网络初始化kaiming分布详解
Aug 18 Python
django 连接数据库出现1045错误的解决方式
May 14 Python
django为Form生成的label标签添加class方式
May 20 Python
Python如何实现大型数组运算(使用NumPy)
Jul 24 Python
Sentry错误日志监控使用方法解析
Nov 12 Python
python not运算符的实例用法
Jun 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实现将GB编码转换为UTF8
2006/11/25 PHP
php 来访国内外IP判断代码并实现页面跳转
2009/12/18 PHP
PHP中的流(streams)浅析
2015/07/02 PHP
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
javascript语言结构小记(一)
2011/09/10 Javascript
深入理解JavaScript是如何实现继承的
2013/12/12 Javascript
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
js实现3D图片展示效果
2017/03/09 Javascript
jQuery中的deferred对象和extend方法详解
2017/05/08 jQuery
Javascript创建类和对象详解
2017/05/31 Javascript
vue axios用法教程详解
2017/07/23 Javascript
从零开始用electron手撸一个截屏工具的示例代码
2018/10/10 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
2020/11/04 Javascript
在Python中操作字典之clear()方法的使用
2015/05/21 Python
Python sorted函数详解(高级篇)
2018/09/18 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
Python Flask框架扩展操作示例
2019/05/03 Python
python tkinter组件摆放方式详解
2019/09/16 Python
荷兰领先的百货商店:De Bijenkorf
2018/10/17 全球购物
外企求职信范文分享
2013/12/31 职场文书
小学美术教学反思
2014/02/01 职场文书
中学校庆方案
2014/03/17 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
小学生优秀评语大全
2014/04/22 职场文书
民主生活会对照检查材料(统计局)
2014/09/21 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
地方白酒代理协议书
2014/10/25 职场文书
安全生产警示教育活动总结
2015/05/09 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python
Spring Boot 的创建和运行示例代码详解
2022/07/23 Java/Android