python _、__和__xx__的区别(转)
本位转载自:http://www.cnblogs.com/coder2012/p/4423356.html
"_"单下划线
Python中不存在真正的私有方法。为了实现类似于c++中私有方法,可以在类的方法或属性前加一个“_”单下划线,意味着该方法或属性不应该去调用,它并不属于API。
在使用property时,经常出现这个问题:

class BaseForm(StrAndUnicode):
... def _get_errors(self):
"Returns an ErrorDict for the data provided for the form"
if self._errors is None:
self.full_clean()
return self._errors errors = property(_get_errors)

上面的代码片段来自于django源码(django/forms/forms.py)。这里的errors是一个属性,属于API的一部分,但是_get_errors是私有的,是不应该访问的,但可以通过errors来访问该错误结果。
"__"双下划线
这个双下划线更会造成更多混乱,但它并不是用来标识一个方法或属性是私有的,真正作用是用来避免子类覆盖其内容。
让我们来看一个例子:
class A(object):
def __method(self):
print "I'm a method in A"
def method(self):
self.__method() a = A() a.method()
输出是这样的:
$ python example.py
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()
现在,结果是这样的:
$ python example.py
I'm a method in A
就像我们看到的一样,B.method()不能调用B.__method的方法。实际上,它是"__"两个下划线的功能的正常显示。
因此,在我们创建一个以"__"两个下划线开始的方法时,这意味着这个方法不能被重写,它只允许在该类的内部中使用。
在Python中如是做的?很简单,它只是把方法重命名了,如下:
a = A()
a._A__method() # never use this!! please!
$ python example.py
I'm a method in A
如果你试图调用a.__method,它还是无法运行的,就如上面所说,只可以在类的内部调用__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__()是用来创建类的实例;先执行__new__()创建实例后才会执行__init__()初始化实例。

class CrazyNumber(object):
def __init__(self, n):
self.n = n
def __add__(self, other):
return self.n - other
def __sub__(self, other):
return self.n + other
def __str__(self):
return str(self.n) num = CrazyNumber(10)
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)
def __len__(self):
return len(self.people) room = Room()
room.add("Igor")
print len(room) # 1

结论
- 使用_one_underline来表示该方法或属性是私有的,不属于API;
- 当创建一个用于python调用或一些特殊情况时,使用__two_underline__;
- 使用__just_to_underlines,来避免子类的重写!
python _、__和__xx__的区别(转)的更多相关文章
- python _、__和__xx__的区别
python _.__和__xx__的区别 本文为译文,版权属于原作者,在此翻译为中文分享给大家.英文原文地址:Difference between _, __ and __xx__ in Pytho ...
- python _/__/__**__区别
"_"单下划线:"单下划线 " 开始的成员变量叫做保护变量,意思是只有类对象(即类实例)和子类对象自己能访问到这些变量,需通过类提供的接口进行访问:不能用'fr ...
- Difference between _, __ and __xx__ in Python
When learning Python many people don't really understand why so much underlines in the beginning of ...
- 面试题 和 python 2与3的期区别
1.3 python2与python3的一些区别 大环境下的区别:python2:1,源码都含有php,Java,C,等语言的规范陋习,2,重复代码特别多. python3:源码很规范,清晰,简单 ...
- Python之str()与repr()的区别
Python之str()与repr()的区别 str()一般是将数值转成字符串,主要面向用户. repr()是将一个对象转成字符串显示,注意只是显示用,有些对象转成字符串没有直接的意思.如list, ...
- Python中type与Object的区别
Python中type与Object的区别 在查看了Python的API后,总算明白了.现在总结如下: 先来看object的说明: Python中关于object的说明很少,甚至只有一句话: clas ...
- Python 头部 #!/usr/bin/python 和 #!/usr/bin/env 的区别
这个网址 https://www.cnblogs.com/scofi/p/4867851.html 讲述了Python 头部 #!/usr/bin/python 和 #!/usr/bin/env 的区 ...
- C、C++、C#、Java、php、python语言的内在特性及区别
C.C++.C#.Java.PHP.Python语言的内在特性及区别: C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作 ...
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
随机推荐
- Android Studio查看其它APP的布局结构
概述 日常使用别家的APP过程中,会遇到一些比较好看的布局,这时候我们就想学习一下别人的布局结构,以便参考. (1)手机连接电脑.设置手机为USB调试模式 (2)运行Android Studio,打开 ...
- 用chardet判断字符编码的方法
转自http://www.cnblogs.com/xiaowuyi/archive/2012/03/09/2387173.html 用chardet判断字符编码的方法 1.chardet下载与安装 ...
- HDU 6249 Alice’s Stamps(2017 CCPC-Final G题,DP)
题目链接 HDU 6249 题意 给定$m$个区间,在这些区间中选出不超过$k$个,求被覆盖的点的数量的最大值. 设$f[i][j]$表示选到第$i$个点并选了$j$个区间的时候能得到的最大答案. 处 ...
- Linked List Cycle - LeetCode
Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...
- POJ 3254 Corn Fields [DP]
题意:略. 思路:第一次做状态压缩的dp. 在这里说一下状态压缩的原则.因为每一行只有最多12个格子,每个格子只有1(可放牛)和0(不可放牛)两种状态,这总共是2^12种状态,直接用一个int整型变量 ...
- Java 实现多线程切换等待唤醒交替打印奇偶数
引言 在日常工作生活中,可能会有用时几个人或是很多人干同一件事,在java编程中,同样也会出现类似的情况,多个线程干同样一个活儿,比如火车站买票系统不能多个人买一到的是同一张票,当某个窗口(线程)在卖 ...
- 【转】java:多网卡环境下获取MAC地址
http://blog.csdn.net/10km/article/details/78569962 JDK6以后 java.net.NetworkInterface提供了完整的方法用于获取网络设备信 ...
- OnChencedChang
(一) 1,布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:and ...
- Android 分享透明图片到微信变黑的问题
/** * bitmap中的透明色用白色替换 * * @param bitmap * @return */ public static Bitmap changeColor(Bitmap bitmap ...
- Linux下不重启永久修改hostname
LINUX下不重启永久修改hostname 1.如果只是修改hostname可以通过如下命令 hostname newHostname 注意:这种修改方式只有当前有效,等服务器重启后hostnam ...