python _、__、__xx__之间的差别

本文来自 yzl11 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yzl11/article/details/53792416?utm_source=copy

单下划线、双下划线、头尾双下划线说明:

1. __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。

当你看到"__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 = 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

---------------------

2._foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *

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来访问该错误结果。

3. __foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。

class A(object):
    def __method(self):
        print "I‘m a method in A"
    def method(self):
        self.__method() a = A() a.method()

---------------------
输出:
I‘m a method in A

给A添加子类

class B(A):
    def __method(self):
        print "I‘m a method in B" 

b = B()
b.method()
-------------------------------
输出:
I‘m a method in A

原文地址:https://www.cnblogs.com/dhs94/p/9757971.html

时间: 2024-10-08 18:59:21

python _、__、__xx__之间的差别的相关文章

Python中_,__,__xx__的区别

_xx 单下划线开头 Python中没有真正的私有属性或方法,可以在你想声明为私有的方法和属性前加上单下划线,以提示该属性和方法不应在外部调用.如果真的调用了也不会出错,但不符合规范. __xx 双下划线开头 双下划线开头,是为了不让子类重写该属性方法.通过类的实例化时自动转换,在类中的双下划线开头的属性方法前加上”_类名”实现. __xx__ 此种写法为python内建属性方法,最好不要在外部调用 参考自:http://blog.csdn.net/wukai_std/article/detai

python _、__和__xx__的区别

本文为译文,版权属于原作者,在此翻译为中文分享给大家.英文原文地址:Difference between _, __ and __xx__ in Python "_"单下划线 Python中不存在真正的私有方法.为了实现类似于c++中私有方法,可以在类的方法或属性前加一个“_”单下划线,意味着该方法或属性不应该去调用,它并不属于API. 在使用property时,经常出现这个问题: class BaseForm(StrAndUnicode): ... def _get_errors(s

比较IE6, IE8, IE11 之间的差别

文档申明为  <!DOCTYPE html> 1.盒子模型 IE6:(使用 !DOCTYPE 声明指定 standards-compliant 模式) margin-left + border-left + padding-left + width + padding-right + border-right + margin-right , 如果没有声明为标准模式则为: margin-left + width + margin-rightIE8: 同IE6的标准模式IE11: 同IE6的标准

&quot;菜鸟&quot;与大神程序员之间的差别(转载)

前段时间看到一篇文章,写得很好,针对菜鸟与大神之间的差别做了很客观.很透彻的分析,现在将文章转载过来,原文地址:http://www.apkbus.com/forum.php?mod=viewthread&tid=239356&highlight=%E8%8F%9C%E9%B8%9F “菜鸟”和“大神” 刚刚走出就业的程序员,技术是刚刚起步的基点.那下面我们就聊一聊有关技术 的东西.首先请您先想想这几个问题.现在社会上有很多程序员,CSDN就是我们程序员的家,那您是否可想过程序员为什么会有

WebSockets和轮训实现之间的差别

如果你曾经使用过一种服务器端语言和一种数据库构建过一个网页聊天室,你会很想知道WebSockets和传统方式实现之间的差别. 传统聊天室通常是使用轮询方法实现的.客户端周期性地向服务器询问是否有更新.服务器回复给客户端更新的数据或者没有更新.然而,传统方法有以下问题.只有客户端主动询问服务器才能从服务器获得更新的数据.这意味着更新的数据会周期性延迟而且服务器的应答不够及时.如果我们想通过减少轮询过程来改进这个问题,则需要更大带宽,因为客户端需要不间断地向服务器发送请求. 下图展示了客户端和服务器

java 继承之间方法的时候(计算出经理与员工之间公司差别)

自己检讨下:刚开始看这个的时候,我觉得挺简单的,但是让我自己写的时候我确实不会写,最大的缺点就是好高骛远,偷懒,基础不会就想着上天. 希望别的朋友别要有这样的想法,再简单的例子,如果你不亲自敲下,在揣摩下,你敢说日后让你写这样的代码,你能写出来吗,我不是天才,但我坚信勤奋可以造就天才. 首先:分析下员工与经理之间的相同点,就是员工与经理都有姓名,工资和日期(其实我感觉这个日期不必要有)这个三个属性,经理比员工多的就是经理又项目奖金 然后可以把相同的信息抽出来,实例一个Employee类 ,这个类

Python小白__网络层级

Python小白__网络分析 刚刚开始接触Python,为了怕遗忘,所以写个博文方便自己回顾,也可以和大家分享,有不同意见,大家共同探讨学习. 网络层级 第一篇是对于网络的一些看法和感想,不只是Python 众做周知,在现在的网络时代,最重要的就是网络通信,通信的方式有甚多 ,有Http,TCP,UDP等等,其不同程序语言实现方式也很多,但是底层的通信原理都相差不多.所以就有了一个网络通信的网络层级之分. 一般网络层级分为四层,分别为:应用层,传输层,网络层,链路层. 假如现在A要传递一条数据给

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 beg

python中_, __, __foo__区别及使用场景

单下划线 1.带有单下划线的特性不会被 from module import *导入. 2.单下划线是Python程序员使用类时的约定,表明程序员不希望类的用户直接访问属性.仅仅是一种约定!实际上,实例._变量,可以被访问. 双下划线 1.防止被子类覆盖. 前后双下划线 供python内部使用,如__init__ new str 等. 原文地址:https://www.cnblogs.com/sixloop/p/python_abc.html