_xx 单下划线开头

Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范.

Python中不存在真正的私有方法。为了实现类似于c++中私有方法,可以在类的方法或属性前加一个“_”单下划线,意味着该方法或属性不应该去调用,它并不属于API。

#!/usr/bin/env python
# coding:utf-8
class Test():def __init__(self):passdef _one_underline(self):  # 定义私有方法,都只能被类中的函数调用,不能在类外单独调用print("_one_underline")def __two_underline(self): # 防止类被覆盖,都只能被类中的函数调用,不能在类外单独调用print("__two_underline")def output(self):self._one_underline()self.__two_underline()
if __name__ == "__main__":obj_test=Test()obj_test.output()
'''
#输出结果为:
localhost:attempt_underline a6$ python undeline.py
_one_underline
__two_underline
'''

"__XX"双下划线

这个双下划线更会造成更多混乱,但它并不是用来标识一个方法或属性是私有的,真正作用是用来避免子类覆盖其内容。

让我们来看一个例子:

#!/usr/bin/env python
# coding:utf-8
class A(object):def __method(self):print("I'm a method in A")def method(self):self.__method()class B(A):def __method(self):print("I'm a method in B")if __name__ == "__main__":a = A()a.method()b = B()b.method()
‘’‘
# 输出结果为:
localhost:attempt_underline a6$ python undeline.py
I'm a method in A
I'm a method in A
’‘’

我们给A添加一个子类,并重新实现一个__method:

class B(A): def __method(self): print("I'm a method in B") b = B()
b.method()

#输出结果为:

I'm a method in A

就像我们看到的一样,B.method()不能调用B.__method的方法。实际上,它是"__"两个下划线的功能的正常显示。

因此,在我们创建一个以"__"两个下划线开始的方法时,这意味着这个方法不能被重写,它只允许在该类的内部中使用。

"__xx__"前后各双下划线
当你看到"__this__"的时,就知道不要调用它。为什么?因为它的意思是它是用于Python调用的,如下:

>>> name = "igor"
>>> name.__len__() 4
>>> len(name) 4
>>> number = 10
>>> number.__add__(20) 30
>>> number + 20 30

“__xx__”经常是操作符或本地函数调用的magic methods。在上面的例子中,提供了一种重写类的操作符的功能。

在特殊的情况下,它只是python调用的hook。例如,__init__()函数是当对象被创建初始化时调用的;__new__()是用来创建实例。

class CrazyNumber(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 = CrazyNumber(10)
print type(num) 输出 <class '__main__.CrazyNumber'>
print num   输出 10
print num + 5 输出 5
print num - 20 输出 30

另外一个例子:

class Room(object):def __init__(self):self.people = []def add(self, person):self.people.append(person)self.people.append(person)def __len__(self):return len(self.people)room = Room()
room.add("Igor")
print len(room)  输出 3

结论

  • 使用_one_underline来表示该方法或属性是私有的,不属于API;
  • 使用__just_to_underlines,来避免子类的重写!
  • 当创建一个用于python调用或一些特殊情况,如子类不能覆盖的那些父类方法时,使用__two_underline__;

python的类中 _、__和__xx__的区别相关推荐

  1. 沙师弟学Python之 _, __ 和 __xx__的区别

    这几天本菜鸟在学习数据结构与算法,学习数据结构与算法免不了要手动实现这些数据结构与算法.在用类定义这些对象的时候,发现老是出现带有 _ ,__ 和__xx__ 的函数,一开始也没怎么在意,想着这些也学 ...

  2. Python 同一个类中不同函数相互调用

    本文采取:Python的类中函数方法相互调用的两种方式_狗哥的博客-CSDN博客 __metaclass__=type class Stu:name=Noneage=Noneschool=" ...

  3. python定义类()中写object和不写的区别

    python定义类()中写object和不写的区别 这里需要说明一下: python3中,类定义默认继承object,所以写不写没有区别 但在python2中,并不是这样 所以此内容是针对python ...

  4. Python 自定义类中NameError错误的解决

    Python 自定义类中NameError错误的解决 自定义类之后,python中常常有莫名其妙的NameError提示出错.经尝试后发现,在修改类代码并保存之后,光重新import类是不够的,需要重 ...

  5. Python中_,__,__xx__的区别

    _xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. #! /usr ...

  6. Python中_,__,__xx__方法区别

    _xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. 方法就是以单下 ...

  7. python类的属性和对象属性_在python的类中动态添加属性与生成对象

    本文将通过一下几个方面来一一进行解决 1.程序的主要功能 2.实现过程 3.类的定义 4.用生成器generator动态更新每个对象并返回对象 5.使用strip 去除不必要的字符 6.rematch ...

  8. python类定义中__init__()_转:python学习——类中为什么要定义__init__()方法

    学习Python的类,一直不太理解为什么一定要定义init()方法,现在简要谈一下自己的理解吧. 1.不用init()方法定义类 定义一个矩形的类,目的是求周长和面积. 1 classRectangl ...

  9. 理解python的类实例化_理解python的类实例化

    让我们以一个Foo类开始: class Foo(object): def __init__(self, x, y=0): self.x = x self.y = y 当你实例化它(即创建该类的一个新的 ...

最新文章

  1. Dom Tree Node, Render Tree Node 结构
  2. ML之RF:利用Pipeline(客户年龄/职业/婚姻/教育/违约/余额/住房等)预测客户是否购买该银行的产品二分类(预测、推理)
  3. __attribute__函数的作用
  4. 谈谈dpdk应用层包处理程序的多进程和多线程模型选择时的若干考虑
  5. 迅雷下载Linux Oracle11gR2和Oracle12c
  6. linux dns 问题吗,Linux下DNS的问题
  7. jQuery和react实现二维码
  8. 加州大学欧文分校 计算机专业,UCI的Computer Science「加州大学欧文分校计算机科学系」...
  9. Xcode:PhoneGap 2.5.0项目创建方法
  10. 51单片机红外遥控小车
  11. 将TXT文件作为数据库批量生成条形码
  12. 双机热备概念原理及实现步骤
  13. PON光通道损耗的计算
  14. Python员工离职数据分析
  15. 163免费企业邮箱服务地址
  16. 我的理想高中作文理想是计算机,我的理想高中优秀作文范文
  17. Python软件编程等级考试三级——20220618
  18. modprobe:FATAL:module xxx not found
  19. 国际移动用户识别码(IMSI)
  20. 博客园2013年4月底至5月初源码发布详情

热门文章

  1. 「释放自我」后,敢说真话的人干趴了会写PPT的人!
  2. 2. web前端开发分享-css,js进阶篇
  3. FILEminimizer Office,FILEminimizer Suite和FILEminimizer Server常见问题FAQ合集(一)
  4. 论文精读|VRCNet:变分关联点云补全网络(CVPR2021)
  5. allegro如何删除没有网络的走线,查还没有连的网络线
  6. 电影《魔兽》教会我们一个道理,粉丝的力量是无穷的!
  7. C语言及程序设计[套餐]课程主页
  8. There is a problem with this Windows Installer package...的安装报错
  9. 基于Grafana的Web监控报警
  10. steam 32位 linux 下载地址,「Linux」- 安装 Steam 客户端