Python实战社群

Java实战社群

长按识别下方二维码,按需求添加

扫码关注添加客服

进Python社群▲

扫码关注添加客服

进Java社群

作者丨王翔丨

来源丨清风Python(ID:BreezePython)

python的各种下划线

在Python中,可能最常见的就是各种常量、变量、函数、方法前后添加的那些下划线了。有前面加的、后面加的,加一个的,加两个的,看到头晕。那么,你对这些知识都掌握了吗 ?让我们先来做一个自测吧。

题目:说明以下四个例子输出的结果分别是什么。

自测题

各位,请开始你的表演,来看看以上4段代码分别输出的结果是什么?OK,记住你的答案,等看完文章解开谜底后,再来看看的答对了没。

单前导下划线

单前导下划线(_xxx),作为Python的命名约定,表示仅供内部使用。但注意这个命名约定,在类中你使用单前导线声明的变量,**依然可以在外部直接访问。**那这种命名约定还有什么意义呢?有!当代码使用

from modlue import *

导入某个模块时,单前导线这种定义方式的属性,不会被导入。举例:

# demo1.py
Name = "清风"
_Age = 18# demo2.py
from demo1 import *print(print(Name,_Age))#output:
NameError: name '_Age' is not defined

正常的情况是如上结果,但是万事无绝对,面试官的阴人考点来了:

__all__ = ["Name", "_Age"]

demo1.py在开头声明如上,使用__all__单独声明了可导入内容时,可以正常导入。虽然使用起来矛盾,但是面试阴人必备有木有?

单末尾下划线

单末尾下划线(xxx_),按照PEP8规定,单末尾下划线也是一个约定 用来避免与python关键字产生命名冲突。

例如:我们使用Beautifulsoup进行网页解析,通过类方法定位时,会找某个标签它的存在class=‘xxx’的情况,此时css的class与Python中的类重名,需要在class后添加单下划线进行区分。类似场景还有很多,就不一一列举了。

双前导和双末尾下划线

日常开发中,最好避免在自己的程序中使用以双下划线(“dunders”)开头和结尾的名称,因为它是Python语言定义的一种特殊方法(魔法方法),我们熟知的__init__ 、__dict__ 、__getitem__等等。

但是,如果你非要使用这种写法去声明,那可真是无底坑...如果你声明的变量不是内置的魔法方法,Python会将它当做普通的变量来操作。如果和内置的方法重名,要么重写,要么因为功能冲突而引发报错,所以不作死就不会死,还是别这么玩了。

双前导下划线

这个为什么放在最后,因为压轴啊!双前导下划线,在面试中被考到的几率太大了,尤其是那种长相猥琐,心术不正的面试官,最爱问这个知识点,所以要牢记。

首先双前导下划线(__xxx)的命名,90%情况下是真切的私有变量、方法,剩下10%一会儿再说。下来说说双前导下划线的作用,既然为私有属性,那么仅在当前类中可用,外部、子类均无法调用和继承。知道这点写代码差不多够了,但还差一点,拿文章开头的最后一个例子来说

# Test4
class Root:def __func(self):print('root')class Child(Root):def __init__(self):self.__func()Child()

大家刚才的答案是什么,root?恭喜你,打错了,结果是:

AttributeError: 'Child' object has no attribute '_Child__func'

不该是子类没有的方法,继承父类么,明明父类有,为什么会报错。刚才我们说到了,双前导下划线是真切的私有变量、方法,无法被子类所继承。如果我们把双前导下划线,变成了单前导下划线(如Test3),那么结果是root。

不能继承的问题明白了,但这个_Child__func是什么鬼?这就要说为什么刚才我说双前导下划线90%的情况下是真切的私有变量了、让我们来看下面的例子:

class Demo:def __init__(self):self.__name = "清风Python"def __say_hello(self):print(f"你好:{self.__name}")D = Demo()
# usually
print(D.__name)
D.__say_hello# specially
print(D._Demo__name)
D._Demo__say_hello()

我们定义一个Demo类,其中存在双前导下划线的__name __say_hello,当我们使用通常的调用方式时,是无法执行的,但Python的私有属性声明时,其实就是将某个私有属性前添加单下划线+类名,所以如果其实不存在什么私有属性,我们可以通过_classname__privatefunc的方式实现强制调用。

那么,日常中我们能否尽量的避免这种方式呢?方法是有的,但是只能骗骗初学者,对有心人还是没用,比如:

class Demo:def __init__(self):self.__money = 100@propertydef money(self):return self.__money@money.setterdef money(self, pwd):passD = Demo()
D.money = 1000000
print(D.money) # 依旧为100块

python的property装饰器,可以将方法声明为类的属性,当某人调用D.money得到自己余额为100块时,肯定想着我重新赋值余额秒变土豪,但真实的余额我们使用的是私有的self.__money。而通过property创建了一个money的属性,当用户对money赋值时,money.setter的方法是空的,你怎么赋值都是无用的(空的干嘛还要写,因为不写会报错啊...AttributeError: can't set attribute)。

这样看起来很完美啊,为什么说只能骗骗初学者?当你打印print(D.__dict__){'_Demo__money': 100}一目了然。

最后,文章开头的测试题答案你做对了么?结果是:

child、root、root、报错  你答对了么?

今天关于Python中下划线的内容就到此为止,是否起到了稳固执行的效果呢?如果觉得有所收获,欢迎分享给你的小伙伴们一起进步啊!

程序员专栏 扫码关注填加客服 长按识别下方二维码进群

近期精彩内容推荐:  

 字节跳动半夜给员工发钱,全员沸腾了

 为何程序员上班时间总戴个耳机?

 为什么建议大家使用 Linux 开发?

 盘点提高国内访问GitHub速度的9种方案

在看点这里好文分享给更多人↓↓

关于Python的前后、单双下划线作用,看完这篇文章,吊打面试官!相关推荐

  1. 【Python基础】关于Python的前后、单双下划线作用

    python的各种下划线 在Python中,可能最常见的就是各种常量.变量.函数.方法前后添加的那些下划线了.有前面加的.后面加的,加一个的,加两个的,看到头晕.那么,你对这些知识都掌握了吗 ?让我们 ...

  2. python长的横线怎么打_关于Python的前后、单双下划线作用,看完这篇文章,吊打面试官!...

    点击上方"AI算法与图像处理",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源:清风pythonpython的各种下划线 在Pyth ...

  3. Python语言学习之双下划线那些事:python和双下划线使用方法之详细攻略

    Python语言学习之双下划线那些事:python和双下划线使用方法之详细攻略 目录 双下划线介绍 1.关于双下划线的函数或方法或属性 双下划线介绍 1.关于双下划线的函数或方法或属性 __name_ ...

  4. 看完这篇文章,你的Python基础就差不多了(附571集精品教程)

    学一门语言贵在坚持用它,不用就淡忘了,而记录下一篇文章也有助于日后快速回忆.全文分为两大部分,分别是Python基础语法和面向对象. 入门Python其实很容易,但是我们要去坚持学习,每一天坚持很困难 ...

  5. 运维学python用不上_作为运维你还在想要不要学Python,看完这篇文章再说!

    原标题:作为运维你还在想要不要学Python,看完这篇文章再说! 本文由马哥教育Python自动化实战班5期学员推荐,转载自简书,作者为Li.Yingjie,内容略经小编改编和加工,观点跟作者无关,最 ...

  6. python装饰器原理-看完这篇文章还不懂Python装饰器?

    原标题:看完这篇文章还不懂Python装饰器? 1.必备 2.需求来了 初创公司有N个业务部门,1个基础平台部门,基础平台负责提供底层的功能,如:数据库操作.redis调用.监控API等功能.业务部门 ...

  7. java与python难度对比_Python和Java的区别,看完这篇文章你就清楚啦

    众所周知,在数不清的编程语言中Java自诞生之日起长盛不衰,可谓是神话般的存在.随着人工智能时代的到来,Python迅速席卷全球,作为当下最热门的编程语言,因其简单实用且应用场景广泛备受青睐. 一个是 ...

  8. python运算符中用来计算整商的是什么_零基础学python,看完这篇文章,你的python基础就差不多了...

    Python基础语法 1. 认识Python 1.1 Python 简介 Python 的创始人为吉多·范罗苏姆(Guido van Rossum). Python 的设计目标: 一门简单直观的语言并 ...

  9. python 只循环目录_看完这篇文章,你的Python基础就差不多了

    世界那么大,谢谢你来看我!!关注我你就是个网络.电脑.手机小达人 前言 本文是基于黑马程序员2019年的Python基础班的内容编写的,以2019年的资料为蓝本,2018年的资料为补充,还参考了一些网 ...

最新文章

  1. vijos P1190繁忙的都市(Kruskal)(最小生成树)
  2. php写网页6,基于ThinkPHP6+AdminLTE框架开发的响应式企业网站CMS系统PHP源码,ThinkPHP6开发的后台权限管理系统...
  3. c++学习笔记内联函数,函数重载,默认参数
  4. HTTP API 自动化测试从手工测试到平台的演变
  5. 一次 Young GC 的优化实践
  6. AD18-画PCB步骤-总结
  7. 【word2vec】篇三:基于Negative Sampling 的 CBOW 模型和 Skip-gram 模型
  8. linux重启后地址不是之前设置的静态地址的解决方案
  9. 移动端返回上一页实现方法
  10. java 系列1:数据类型转换
  11. 关于iptables配置的心得
  12. Python2.7学习笔记-定义函数、filter/map/reduce/lambda
  13. event.type 事件属性
  14. [新功能]文章预览功能
  15. C语言实现BMP格式转RGB格式、YUV格式
  16. xilinx PCIe PIO工程仿真及验证
  17. 《秘密》读后感之秘密的揭露和法则
  18. 基于单片机的led阅读灯方案
  19. wkhtmltopdf 照片不显示的问题
  20. 【数据结构】——环形队列

热门文章

  1. 网站加入滚动字幕或公告说明
  2. Vue--Router--解决watch监听路由无效的问题
  3. 史上最牛最强的linux学习笔记 7.用户和用户组管理
  4. 微软输入法怎么最小化到托盘_微软推出 Windows 10X 系统模拟器,未来的双屏电脑系统长这样?...
  5. CSS3 @media 查询(制作响应式布局)
  6. 简单易懂读《重构》 - Feature Envy (依恋情结)
  7. ITU601与ITU656
  8. 巨量算数 Data解密
  9. React Native常用第三方组件汇总【建议收藏】
  10. 设置页眉页脚--分节符