Difference between _, __ and __xx__ in Python
When learning Python many people don't really understand why so much underlines in the beginning of the methods, sometimes
even in the end like __this__
! I've already had to explain it so many times, it's time to document it.
One underline in the beginning
Python doesn't have real private methods, so one underline in the beginning of a method or attribute means you shouldn't access
this method, because it's not part of the API. It's very common when using properties:
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)
This snippet was taken from django source code (django/forms/forms.py). This means errors
is a property, and it's part of the API,
but the method this property calls, _get_errors
, is "private", so you shouldn't access it.
Two underlines in the beginning
This one causes a lot of confusion. It should not be used to mark a method as private, the goal here is to avoid your method to be
overridden by a subclass. Let's see an example:
class A(object):
def __method(self):
print "I'm a method in A" def method(self):
self.__method() a = A()
a.method()
The output here is
$ python example.py
I'm a method in A
Fine, as we expected. Now let's subclass A
and customize __method
class B(A):
def __method(self):
print "I'm a method in B" b = B()
b.method()
and now the output is...
$ python example.py
I'm a method in A
as you can see, A.method()
didn't call B.__method()
as we could expect. Actually this is the correct behavior for __
. So when you create
a method starting with __
you're saying that you don't want anybody to override it, it will be accessible just from inside the own class.
How python does it? Simple, it just renames the method. Take a look:
a = A()
a._A__method() # never use this!! please!
$ python example.py
I'm a method in A
If you try to access a.__method()
it won't work either, as I said, __method
is just accessible inside the class itself.
Two underlines in the beginning and in the end
When you see a method like __this__
, the rule is simple: don't call it. Why? Because it means it's a method python calls, not you.
Take a look:
>>> name = "igor"
>>> name.__len__()
4
>>> len(name)
4 >>> number = 10
>>> number.__add__(20)
30
>>> number + 20
30
There is always an operator or native function that calls these magic methods. The idea here is to give you the ability to override
operators in your own classes. Sometimes it's just a hook python calls in specific situations. __init__()
, for example, is called when
the object is created so you can initialize it. __new__()
is called to build the instance, and so on...
Here's an example:
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 #
print num + 5 #
print num - 20 #
Another example:
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) #
The documentation covers all these special methods.
Difference between _, __ and __xx__ in Python的更多相关文章
- python _、__和__xx__的区别
python _.__和__xx__的区别 本文为译文,版权属于原作者,在此翻译为中文分享给大家.英文原文地址:Difference between _, __ and __xx__ in Pytho ...
- Python中_,__,__xx__的区别
_xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. #! /usr ...
- Difference between exit() and sys.exit() in Python
Difference between exit() and sys.exit() in Python - Stack Overflow https://stackoverflow.com/questi ...
- python _、__和__xx__的区别(转)
本位转载自:http://www.cnblogs.com/coder2012/p/4423356.html "_"单下划线 Python中不存在真正的私有方法.为了实现类似于c++ ...
- python中 _、__、__xx__() 区别及使用场景
1.访问权限(private.public)与继承方式(只有public继承) 在面向对象编程语言中,类的属性与方法都会设置访问控制权限,从而满足我们的设计需求.一般而言,我们通常会将对象的属性设置为 ...
- Python中_,__,__xx__方法区别
_xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. 方法就是以单下 ...
- 【python】python _、__、__xx__之间的差别
本文来自 yzl11 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yzl11/article/details/53792416?utm_source=copy 单下 ...
- python _、__、__xx__之间的差别
默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类public,private等关键词来修饰成员函数和成员变量.其实,Python并没有真正的私有化支持, ...
- python中_、__、__xx__(单下划线、双下划线等)的含义
(1)_xxx "单下划线 " 开始的成员变量相当于私有变量,也叫做保护变量,意思是只有类实例和子类实例能访问到这些变量,需通过类提供的接口进行访问(可以定义有点像java中的ge ...
随机推荐
- Xamarin Android提示找不到资源属性定义
Xamarin Android提示找不到资源属性定义 错误信息:”Resource.Attribute”未包含”actonBarSize”的定义Xamarin Android经常会出现找不到资源属性的 ...
- [LintCode] Continuous Subarray Sum II
Given an integer array, find a continuous rotate subarray where the sum of numbers is the biggest. Y ...
- 矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence
题目传送门 /* 题意:加上适当的括号,改变计算顺序使得总的计算次数最少 矩阵连乘积问题,DP解决:状态转移方程: dp[i][j] = min (dp[i][k] + dp[k+1][j] + p[ ...
- Android 滑动冲突处理
要想解决滑动冲突就必须好好理解 Android 的事件分发机制.不了解 Android 事件分发机制的请先参考资料学习一下. 一般有 2 种方法 1 外部拦截法 这个非常简单,因为事件是从父 view ...
- ZOJ 3913 Bob wants to pour water ZOJ Monthly, October 2015 - H
Bob wants to pour water Time Limit: 2 Seconds Memory Limit: 65536 KB Special Judge There i ...
- 【BZOJ】3673: 可持久化并查集 by zky & 3674: 可持久化并查集加强版(可持久化线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3674 http://www.lydsy.com/JudgeOnline/problem.php?id ...
- BZOJ4230: 倒计时
4230: 倒计时 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 20 Solved: 12[Submit][Status][Discuss] De ...
- FlyCapture2 Qt5 MinGW Configuration
Install FlyCatprue2 to the folder "C:\PointGreyResearch\" Add the following to the .pro fi ...
- QLineEdit 使用方法
在Qt中,QLineEdit是文本编辑框控件,是比较基础且常用的控件的之一,下面是其的一些基本操作. 比如: 禁用或启用该控件 // lineedit is the object name of QL ...
- 在Eclipse中配置Tomcat 创建和运行Servlet/JSP
在Eclipse中配置Tomcat 创建和运行Servlet/JSP 步骤一:在Eclipse中配置Tomcat(注意下载Eclipse IDE for Java EE Developers) (1) ...