python 中_ 与__ 与__xxxx__的区别

_xx 单下划线开头

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

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

  1. #!/usr/bin/env python

  2.  

    # coding:utf-8

  3.  

    class Test():

  4.  

    def __init__(self):

  5.  

    pass

  6.  

    def _one_underline(self):  # 定义私有方法,都只能被类中的函数调用,不能在类外单独调用

  7.  

    print("_one_underline")

  8.  

    def __two_underline(self): # 防止类被覆盖,都只能被类中的函数调用,不能在类外单独调用

  9.  

    print("__two_underline")

  10.  

  11.  

    def output(self):

  12.  

    self._one_underline()

  13.  

    self.__two_underline()

  14.  

    if __name__ == "__main__":

  15.  

  16.  

    obj_test=Test()

  17.  

    obj_test.output()

  18.  

    ‘‘‘

  19.  

    #输出结果为:

  20.  

    localhost:attempt_underline a6$ python undeline.py

  21.  

    _one_underline

  22.  

    __two_underline

  23.  

    ‘‘‘

"__XX"双下划线

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

让我们来看一个例子:

  1. #!/usr/bin/env python

  2.  

    # coding:utf-8

  3.  

    class A(object):

  4.  

    def __method(self):

  5.  

    print("I‘m a method in A")

  6.  

    def method(self):

  7.  

    self.__method()

  8.  

  9.  

    class B(A):

  10.  

    def __method(self):

  11.  

    print("I‘m a method in B")

  12.  

  13.  

    if __name__ == "__main__":

  14.  

    a = A()

  15.  

    a.method()

  16.  

    b = B()

  17.  

    b.method()

  18.  

    ‘’‘

  19.  

    # 输出结果为:

  20.  

    localhost:attempt_underline a6$ python undeline.py

  21.  

    I‘m a method in A

  22.  

    I‘m a method in A

  23.  

    ’‘’

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

  1. class B(A):

  2.  

    def __method(self):

  3.  

    print("I‘m a method in B")

  4.  

  5.  

    b = B()

  6.  

    b.method()

#输出结果为:

I‘m a method in A

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

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

"__xx__"前后各双下划线

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

  1. >>> name = "igor"

  2.  

    >>> name.__len__() 4

  3.  

    >>> len(name) 4

  4.  

    >>> number = 10

  5.  

    >>> number.__add__(20) 30

  6.  

    >>> number + 20 30

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

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

  1. class CrazyNumber(object):

  2.  

    def __init__(self, n):

  3.  

    self.n = n

  4.  

    def __add__(self, other): #加法

  5.  

    return self.n - other

  6.  

    def __sub__(self, other): #减法

  7.  

    return self.n + other

  8.  

    def __str__(self):

  9.  

    return str(self.n)

  10.  

  11.  

    num = CrazyNumber(10)

  12.  

    print type(num) 输出 <class ‘__main__.CrazyNumber‘>

  13.  

    print num 输出 10

  14.  

    print num + 5 输出 5

  15.  

    print num - 20 输出 30

另外一个例子:

  1. class Room(object):

  2.  

    def __init__(self):

  3.  

    self.people = []

  4.  

  5.  

    def add(self, person):

  6.  

    self.people.append(person)

  7.  

    self.people.append(person)

  8.  

  9.  

    def __len__(self):

  10.  

    return len(self.people)

  11.  

  12.  

  13.  

    room = Room()

  14.  

    room.add("Igor")

  15.  

    print len(room)  输出 3

结论

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

原文地址:https://www.cnblogs.com/TF511/p/10963935.html

时间: 2024-10-07 20:33:09

python 中_ 与__ 与__xxxx__的区别的相关文章

python中_、__和__xx__的区别

python中_.__和__xx__的区别 本文为译文,版权属于原作者,在此翻译为中文分享给大家. 英文原文地址:Difference between _, __ and __xx__ in Python 在学习Python时,很多人都弄不清楚各种下划线的意思,而且在这之前已经给其他人解释过很多遍了,是时候把它记录下来. "_"单下划线 Python中不存在真正的私有方法.为了实现类似于c++中私有方法,可以在类的方法或属性前加一个“_”单下划线,意味着该方法或属性不应该去调用,它并不

Python中_,__,__xx__的区别

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

简述Python中&quot;_&quot;的使用常识

0. 背景 Python里面的下划线"_"使用频率明显比其他主流语言要多的多,而且在Python中,它也有自己独到的用处.本文主要简述:下划线在python中的使用常识. 1. 单下划线-将名称封装到类中 如果想将类中的"私有"数据封装到类的实例上,但是又需要考虑到Python缺乏对属性的访问控制问题.与其依赖语言特性来封装数据,Python程序员们更期望通过特定的命名规则来表达出对数据和方法的用途. 第一个规则是任何以单下划线(_)开头的名字应该总是被认为只属于内

python _、__和__xx__的区别

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

Python中元组,列表,字典的区别

Python中,有3种内建的数据结构:列表.元组和字典.1.列表     list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目.列表中的项目.列表中的项目应该包括在方括号中,这样python就知道你是在指明一个列表.一旦你创建了一个列表,你就可以添加,删除,或者是搜索列表中的项目.由于你可以增加或删除项目,我们说列表是可变的数据类型,即这种类型是可以被改变的,并且列表是可以嵌套的.实例:#coding=utf-8animalslist=['fox','tiger','ra

Python基础学习-Python中最常见括号()、[]、{}的区别

Python中最常见括号的区别: 在Python语言中最常见的括号有三种,分别是:小括号().中括号[].花括号{}:其作用也不相同,分别用来代表不同的Python基本内置数据类型. Python中的小括号(): 代表tuple元祖数据类型,元祖是一种不可变序列.创建方法很简单,大多数时候都是小括号括起来的. 1 >>> tup = (1,2,3) 2 >>> tup 3 (1, 2, 3) 4 >>> () #空元祖 5 () 6 >>&

关于python中赋值、浅拷贝、深拷贝之间区别的深入分析

大家都知道,在python中复制一个对象有多种方法,其中常用的是赋值.浅拷贝和深拷贝,这三者之间有哪些区别和哪些坑呢? 首先,定义一下: 赋值:  a =1    b =a    a赋值给了b 浅拷贝: a = []  b = a.copy() 或者import copy             b = copy.copy(a) 深拷贝:import copy  a = []   b = copy.deepcopy(a) 未完待续

python中使用eval() 和 ast.literal_eval()的区别

eval函数在python中做数据类型的转换还是很有用的.它的作用就是把数据还原成它本身或者是能够转化成的数据类型. 那么eval和ast.literal_val()的区别是什么呢? eval在做计算前并不知道需要转化的内容是不是合法的(安全的)python数据类型.只是在调用函数的时候去计算.如果被计算的内容不是合法的python类型就会抛出异常. ast.literal则会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算. --------------

python中函数参数*args和**kw的区别

1.函数与参数(实参) 在python中创建函数是def,创建函数名是def f(),f函数名字,def f(a,b),这里的a,b是两个参数,函数名是自定义的,参数也是自定义,随意就好.看图如下效果: 这里f(1,2)是实参,然后调用上面的函数. 下面讲解下*args和**kw的区别. 2.*args 这里的*后面的值是自定义的,只要不是数字就行,定义成*abc,*ccc都可以,len()是函数,它的意思是返回字符串长度.然后前面的a,b是普通参数,print a print b就是回显1,2