这几天本菜鸟在学习数据结构与算法,学习数据结构与算法免不了要手动实现这些数据结构与算法。在用类定义这些对象的时候,发现老是出现带有 _ ,__ 和__xx__ 的函数,一开始也没怎么在意,想着这些也学过,但是今天仔细思考一下这些用法与区别,才发现已经忘的七七八八了,就这样好奇心逼着我去找出他们的区别。阅读了几篇博客之后,本菜鸟知道了这三兄弟的区别。

1. "_" 单下划线

Python中是不存在真正的私有方法的,但是为了实现类似于c++中的私有方法,于是就在类的方法或者属性前加一个“_”,意味着该方法或者属性就不应该被调用了。

class A(object):def _test(self):print("这个函数不应该通过_tset调用,而应该通过test调用")def test(self):return self._test()a = A()
a._test()
a.test()
复制代码

结果

这个函数不应该通过_tset调用,而应该通过test调用
这个函数不应该通过_tset调用,而应该通过test调用
复制代码

由此可得,这个方法是能被调用的,但出于某种约定,我们是一般不去调用的。

2. “__” 双下划线

双下划线表示的是私有类型的变量,既然是私有了,那肯定就不允许子类访问了,只允许这个类(self)自身访问。

class A(object):def __test(self):print("I am test in A")def test(self):return self.__test()a = A()
a.test()
复制代码

结果:

I am test in A
复制代码

返回的结果是我们预料之中的。


接着,我们给A添加一个子类,并重新定义它的__test()方法。

class B(A):def __test(self):print("I am test in B")b = B()
b.test()
复制代码

现在,结果是这样的:

I am test in A
复制代码

可见,子类B重新定义之后的__test()返回的依然是A类中的__method(),由此我们可以知道以“__"开头的方法是不能被重写的,只允许在内部使用

"__ xx __" 前后双下划线

这种方法被称为magic methods(魔术方法),一般是系统定义名字,类似于__init__(),一般是给Python调用的。

class WrongMethod(object):def __init__(self, n):self.n = ndef __add__(self, other):return self.n - otherdef __sub__(self, other):return self.n + otherdef __str__(self):return str(self.n)num = WrongMethod(20)
print("num = ", num)
print("num + 10 = ", num + 10)
print("num - 10 = ", num - 10)
复制代码

结果

num =  20
num + 10 =  10
num - 10 =  30
复制代码

上面的例子就能比较好的提现出来,"__ xx __" 这种方法一般是Python调用的。

结论

  1. ”_“ 是私有的,一般不应该被调用
  2. ”__“ 是为了避免子类重写某个函数而使用的
  3. ”__ xx __“ 一般是用于Python调用

转载于:https://juejin.im/post/5cade1d2e51d456e2c2484de

沙师弟学Python之 _, __ 和 __xx__的区别相关推荐

  1. 沙师弟学Python多任务之线程

    什么叫多任务呢? 在现实生活中,有很多场景是同时进行的,比如唱歌跳舞,试想如果把这两者分开来,该有多滑稽. 多任务其实就是操作系统同时处理多个任务,处理多任务得有多核处理器,所以在多核处理器普及之后, ...

  2. 简学Python第二章__巧学数据结构文件操作

    Python第二章__巧学数据结构文件操作 欢迎加入Linux_Python学习群  群号:478616847 目录: 列表 元祖 索引 字典 序列 文件操作 编码与文件方法 本站开始将引入一个新的概 ...

  3. 跟我从零开始学python之一_从零开始学 Python 之运算符

    从零开始学 Python 之运算符 前言 大家好,这里是「痴海」从零开始学习 Python 系列教程.此文首发于「痴海」公众号,欢迎大家去关注.学习一门语言最好的办法,就是教懂别人.在这公众号,我会从 ...

  4. 看漫画学python 豆瓣_漫画,小莉要学Python后端,看大牛是怎么教她的!

    Python 是一门开源免费.通用型的脚本编程语言,它上手简单,功能强大.Python 类库极其丰富,Python 在 web 开发方面有着广泛的应用,比如常见的 python web 框架有 dja ...

  5. 文科生学python系列_文科生学 Python 系列 3:函数

    文科生学Python系列3:函数​www.jianshu.com 还是第二课的内容 函数是一段可以重复使用的代码,往往是为了解决某个特定的人物.在 Python 中有两种函数:内置函数和自定义函数. ...

  6. 学python编程_少儿学Python编程的一些思考

    自从孩子上了初中,孩子妈就开始盯着各种真假难辨的中考.高考新政传言.当她从铺天盖地的少儿编程广告里获悉,编程将纳入中考,高考范围,并且2018年高考,多个省份的数学卷甚至都出现了编程题时,就变得异常兴 ...

  7. 从零开始学python项目_从零开始可以这样学python

    从零开始学python第二章 面向对象第一篇 太原理工大学机器人团队20日打卡day9 ​ 当我们讨论python时不得不讨论到面向对象,而我身为机器人团队的一名成员,在平时设计的时候可以通过把机器人 ...

  8. 1688学python学不会_还在害怕学不会Python嘛?这篇文章让你瞬间读懂Python入门!...

    零基础学习Python能学会吗?这个问题几乎是所有初学Python的小白都会问到的问题.其实Python是非常适合初学者入门的,相较于其他主流类编程语言,Python具有更好的可读性,因此上手更容易, ...

  9. 逻辑性不好可以学python吗_如果本文若未能让你学会“Python”,可能真的不适合学习Python...

    很多小伙伴们会问学习Python难学吗? python就是以他简单易学出名的.几乎是现在最简单,却可塑性最高的语言了.一般有其它编程语言基础的,自学,三小时左右就能学会.现在Python都有给小朋友的 ...

最新文章

  1. SAP的安装后基本设定
  2. 反射式红外光电管 ITR8307
  3. linux 设备文件分区命令,Linux常见设备及相应/dev/xxx文件名、Mount Point、挂载点、Mount命令、fstab、挂载分区(示例代码)...
  4. AtomicIntegerArray和AtomicIntegerFieldUpdater
  5. strcpy函数_错误更正(拷贝赋值函数的正确使用姿势)
  6. ABP文档 - Javascript Api - AJAX
  7. util.java_TelnetUtil.java
  8. winfrom 从网页中通过源代码截取文章
  9. 图像相似度(信息学奥赛一本通-T1123)
  10. 教你用Python 每日定时推送睡前小故事给你__的人
  11. Mac OS X 11中的/usr/bin 的“Operation not permitted”
  12. R12应付款模块的费用报表(Expense Report)处理流程
  13. 广联达登录显示服务器异常去回答,广联达设置服务器异常5
  14. 对有父子关系的层级数据项,递归实现绑定到ListControl进行树状列表化的分层输出...
  15. AssetPostprocessor.OnPreprocessModel
  16. 抖音python上的代码_抖音代码舞python实例代码
  17. Vue中图片加载问题总结
  18. 百度AI攻略:驾驶行为识别
  19. py: pip3老,导致安装 flask avatar 依赖的 pillow 安装不上
  20. Java多重继承的两种方式

热门文章

  1. HCIE认证培训 华为AAA认证详解-ielab
  2. 刷题 保持城市天际线
  3. 电动汽车充电站监控系统设计_kaic
  4. MATLAB 不同区间的曲线合并
  5. 双十一热潮在即:猫狗大战将一触即发
  6. swift 可选型的使用
  7. (1)数组乱序(3)数组中获取随机数
  8. 中国房地产价格还在涨
  9. 周深与邓丽君同台,vtuber能扛起元宇宙的大旗吗?
  10. 2022年全球与中国汽车电动座椅电机市场现状及未来发展趋势