精华内容
下载资源
问答
  • 内容目录单下划线与双下划线的区别​ Python用下划线作为前缀和后缀指定特殊变量和定义方法,主要有如下四种形式:单下划线(_)名称前的单下划线(如:_name)名称前的双下划线(如:__name)名称前后的双下划线(如:_ ...

    内容目录

    单下划线与双下划线的区别

    ​ Python用下划线作为前缀和后缀指定特殊变量和定义方法,主要有如下四种形式:

    单下划线(_)

    名称前的单下划线(如:_name)

    名称前的双下划线(如:__name)

    名称前后的双下划线(如:_ init _)

    单下划线(_)

    ​ 只有单划线的情况,主要有两种使用场景:

    ​ 1、在交互式解释器中,单下划线“_”代表的是上一条执行语句的结果。如果单下划线前面没有语句执行,交互式解释器将会报单下划线没有定义的错误。也可以对单下划线进行赋值操作,这时单下划线代表赋值的结果。但是一般不建议对单下划线进行赋值操作,因为单下划线内建标识符。

    "", line 1, in 

    '_' is not defined

    "python"

    'python'

    'python'

    "Java"

    'Java'

    2、单下划线“_”还可以作为特殊的临时变量。如果一个变量在后面不会再用到,并且不想给这个变量定义名称,这时就可以用单下划线作为临时性的变量。比如对for循环语句遍历的结果元素并不感兴趣,此时就可以用单下划线表示。

    # _ 这个变量在后面不会用到

    for _ in range(5):

    "Python")

    名称前的单下划线(如:_name)

    ​ 当在属性和方法前面加上单下划线“_”,用于指定属性和方法是“私有”的。但是Python不像Java一样具有私有属性、方法、类,在属性和方法之前加单下划线,只是代表该属性、方法、类只能在内部使用,是API中非公开的部分。如果用from import * 和 from import * 时,这些属性、方法、类将不被导入。

    # Test.py 文件

    #普通属性

    "Java"

    #单下划线属性

    "Python"

    #普通方法

    def  method():

    "我是普通方法")

    #单下划线方法

    def _otherMethod():

    "我是单下划线方法")

    #普通类

    class PClass(object):

    def __init__(self):

    "普通类的初始化")

    #单下划线类

    class _WClass(object):

    def __init__(self):

    "单下划线类的初始化")

    ​ 将上述的Test.py文件导入,进行测试。

    from Test import *

    'Java'

    "", line 1, in 

    '_otherValue' is not defined

    "", line 1, in 

    '_otherMethod' is not defined

    "", line 1, in 

    '_WClass' is not defined

    ​ 从上面的结果可以看出,不管是属性、方法和类,只要名称前面加了单下划线,都不能导出。

    ​ 如果对程序进行修改,将在开头加入_ all _,结果会是如何?

    # Test.py 文件

    #将普通属性、单下划线的属性、方法、和类加入__all__列表

    "value","_otherValue","_otherMethod","_WClass"]

    #普通属性

    "Java"

    #单下划线属性

    "Python"

    #普通方法

    def  method():

    "我是普通方法")

    #单下划线方法

    def _otherMethod():

    "我是单下划线方法")

    #普通类

    class PClass(object):

    def __init__(self):

    "普通类的初始化")

    #单下划线类

    class _WClass(object):

    def __init__(self):

    "单下划线类的初始化")

    ​ 将上述修改过的Test.py文件导入,进行测试。

    from Test import *

    'Java'

    'Python'

    "", line 1, in 

    'method' is not defined

    "", line 1, in 

    'PClass' is not defined

    ​ _ all _是一个字符串列表,不管是普通的还是单下划线的属性、方法和类,都将导出来,使用其他不在这个字符列表上的属性、方法和类,都会报未定义的错误。

    ​ 不管是属性、方法和类,只要名称前面加了单下划线,都不能导入。除非是模块或包中的“_ all_”列表显式地包含了它们。

    名称前的双下划线(如:__name)

    ​ 我们先看看下面的程序:

    class Method(object):

    # 构造器方法

    def __init__(self, name):

    # 双下划线属性

    # 普通方法

    def sayhello(self):

    "Method say hello!")

    # 双下划线方法

    def __sayhi(self):

    "Method say hi!")

    # 初始化Method

    "Python")

    # 调用sayhello方法

    # 调用sayhi方法

    # 输出属性__name

    ​ 上面的程序定义了一个类,这个类有三个方法,一个构造器方法,一个普通方法,一个双下划线方法,以及包括一个双下划线的属性。上面的结果输出的是什么?很多读者可能认为输出的结果如下:

    ​ 那么恭喜你,上面的输出结果是错误的,实际输出的结果为:

    "", line 18, in 

    'Method' object has no attribute '__sayhi'

    ​ 实际上,当对象调用__sayhi()方法时,将会报Method类没有这个方法属性的错误。那如何去调用以双下划线开头的方法和属性?Python这样设计的目的是什么?

    ​ 首先回答第一个问题,读者看完下面的程序就知道怎么调用了。

    class Method(object):

    def __init__(self, name):

    def sayhello(self):

    "Method say hello!")

    def __sayhi(self):

    "Method say hi!")

    # 初始化Method

    "Python")

    # 调用sayhello方法

    # 调用sayhi方法

    #m.__sayhi()

    # 输出属性__name

    #print(m.__name)

    ​ 输出结果如下:

    say hello!

    say hi!

    ​ 我们从上面的程序中可以很清楚的看到,如果要调用以双下划线开头的方法和属性,只要以“类名_方法(属性)”的形式就可以实现方法或者属性的访问了。类前面是单下划线,类名后面是双下划线,然后再加上方法或者属性。但是并不建议调用,因为这是Python内部进行调用的形式。

    ​ 回答完第一个问题,我们看看第二个问题,Python这样设计的目的是什么?

    ​ 有很多人认为,Python以双下划线开头的方法和属性表示私有的方法和属性,实际上这样的理解不太准确,也不能说完全错误的。但是这并不是Python设计的目的和初衷,我们先看看下面一段程序和程序运行结果:

    class AMethod(object):

    def __method(self):

    "__method in class Amethod!")

    def method(self):

    "anthod method in class AMethod!")

    class BMethod(AMethod):

    def __method(self):

    "__method in class Bmethod!")

    if __name__=="__main__":

    "调用AMethod的method方法")

    "调用BMethod的method方法")

    ​ 上面的程序定义了两个类,一个是AMethod类,另外一个是继承了AMethod类的BMethod类。在AMethod类中,定义了两个方法,一个是以双下划线开头的__method方法,另外一个是普通方法。在BMethod类中,重写了AMethod类中的__method方法。

    ​ 程序运行结果:

    in class Amethod!

    anthod method in class AMethod!

    BMethod的method方法

    __method in class Amethod!

    anthod method in class AMethod!

    ​ 运行结果并不是我们想要的结果,b.method()并没有调用BMethod类的__method方法,而这个设计的实际目的是为了避免父类的方法被子类轻易的覆盖。

    名称前后的双下划线(如:_ init _)

    ​ 在Python类中,我们可以常常看到类似于“_ init _ ”的方法,这表示在Python内部调用的方法,一般不建议在程序中调用。比如,当调用len()方法时,实际上调用了 Python中内部的 _ len _ 方法,虽然不建议调用这种以双下划线开头以及结尾的方法,但是可以对这些方法进行重写。比如下面的例子:

    class Number(object):

    def __init__(self, number):

    def __add__(self, number):

    # 重写方法,返回两个数的差值

    return self.number - number

    def __sub__(self, number):

    # 重写方法,返回两个数的和

    return self.number + number

    def __str__(self):

    # 重写方法,返回字符串

    return str(self.number)

    100)

    # 100 调用了__str__方法

    50) # 50 + 调用了__add__方法

    -20) # 120 -调用了__sub__方法

    ​ 相信看了上面所有对Python中下划线作用的讲解,完全能够理解上述四种下划线所表示的意义。最后将对上面的,进行总结。

    总结

    单下划线(_): 在交互解释器中,表示上一条语句执行输出的结果。另外,单下划线还可以作为特殊的临时变量,表示在后面将不会在用到这个变量。

    名称前的单下划线:只能在内部使用,是API中非公开的部分,不能被 import * 和 from import *导入程序中,除非在all列表中包含了以单下划线开头的属性、方法以及类。

    名称前的双下划线:以双下划线开头的属性、方法表示避免父类的属性和方法被子类轻易的覆盖,一般不建议这样定义属性和方法,除非你自己将要做什么。

    名称前后的双下划线:这类方法是Python内部定义的方法,你可以重写这些方法,这样Python就可以调用这个重写的方法以及利用操作符。

    展开全文
  • 一、Python用下划线作为变量... 双下划线开头:__xxx:模块内的私有成员,外部无法直接调用。即:私有类型的变量。只能是允许这个类本身进行访问了。连子类也不可以3. 双下划线开头和结尾:__xxx__ :系统定义名字, ...

    一、Python 用下划线作为变量前缀和后缀指定特殊变量

    1. 单下划线开头:

    _xxx:弱“内部使用”标识,如:”from Module import *”,将不导入所有以下划线开头的对象,包括包、模块、成员

    2. 双下划线开头:

    __xxx:模块内的私有成员,外部无法直接调用。

    即:私有类型的变量。只能是允许这个类本身进行访问了。连子类也不可以

    3. 双下划线开头和结尾:

    __xxx__ :系统定义名字, 用户无法控制的命名空间中的“魔术”对象或属性, 如:

    __name__、__doc__、__init__、__import__、__file__等;

    二、python常用的魔法方法及变量

    转自:http://www.cnblogs.com/DxSoft/p/3506627.html

    __new__: 是一个类的初始化过程中第一个被执行的方法。它创建了类,然后把一些参数传递给__init__

    _init__(self, [...): 类的构造器,当初始构造方法被执行

    __del__(self):如果 __new__ 和 __init__ 形成一个类的构造函数,__del__ 是就是析构函数

    __str__(self):定义当 str() 被你的一个类的实例调用时所要产生的行为。

    Magic

    Method

    何时被调用(例子)

    Explanation

    __new__(cls [,...])

    instance = MyClass(arg1, arg2)

    __new__ is called on instance creation

    __init__(self [,...])

    instance = MyClass(arg1, arg2)

    __init__ is called on instance creation

    __cmp__(self, other)

    self == other, self > other, etc.

    Called for any comparison

    __pos__(self)

    +self

    Unary plus sign

    __neg__(self)

    -self

    Unary minus sign

    __invert__(self)

    ~self

    Bitwise inversion

    __index__(self)

    x[self]

    Conversion when object is used as index

    __nonzero__(self)

    bool(self)

    Boolean value of the object

    __getattr__(self, name)

    self.name # name doesn‘t exist

    Accessing nonexistent attribute

    __setattr__(self, name, val)

    self.name = val

    Assigning to an attribute

    __delattr__(self, name)

    del self.name

    Deleting an attribute

    __getattribute__(self, name)

    self.name

    Accessing any attribute

    __getitem__(self, key)

    self[key]

    Accessing an item using an index

    __setitem__(self, key, val)

    self[key] = val

    Assigning to an item using an index

    __delitem__(self, key)

    del self[key]

    Deleting an item using an index

    __iter__(self)

    for x in self

    Iteration

    __contains__(self, value)

    value in self,value not in self

    Membership tests using in

    __call__(self [,...])

    self(args)

    "Calling" an instance

    __enter__(self)

    with self as x:

    with statement context managers

    __exit__(self, exc, val, trace)

    with self as x:

    with statement context managers

    __getstate__(self)

    pickle.dump(pkl_file, self)

    Pickling

    __setstate__(self)

    data = pickle.load(pkl_file)

    Pickling

    三、 双下划线开头和结尾的函数及变量枚举:

    x.__add__(y)          等价于  x+y

    x.__contains__(y)   等价于 y in x, 在list,str, dict,set等容器中有这个函数

    __base__, __bases__, __mro__,    关于类继承和函数查找路径的

    class.__subclasses__(),                 返回子类列表

    x.__call__(...) 等价于   x(...)

    x.__cmp__(y) 等价于   cmp(x,y)

    x.__getattribute__(‘name‘) 等价于  x.name   等价于  getattr(x, ‘name‘),  比__getattr__更早调用

    x.__hash__()  等价于   hash(x)

    x.__sizeof__(), x在内存中的字节数, x为class得话, 就应该是x.__basicsize__

    x.__delattr__(‘name‘) 等价于 del x.name

    __dictoffset__ attribute tells you the offset to where you find the pointer to the __dict__ object in any instance object that has one. It is in bytes.

    __flags__, 返回一串数字,用来判断该类型能否被序列化(if it‘s a heap type), __flags__ & 512

    S.__format__, 有些类有用

    x.__getitem__(y) == x[y], 相应还有__setitem__, 某些不可修改类型如set,str没有__setitem__

    x.__getslice__(i, j) == x[i:j], 有个疑问,x=‘123456789‘, x[::2],是咋实现得

    __subclasscheck__(), check if a class is subclass

    __instancecheck__(), check if an object is an instance

    __itemsize__, These fields allow calculating the size in bytes of instances of the type. 0是可变长度, 非0则是固定长度

    x.__mod__(y) == x%y, x.__rmod__(y) == y%x

    x.__module__ , x所属模块

    x.__mul__(y) == x*y,  x.__rmul__(y) == y*x

    __reduce__, __reduce_ex__ , for pickle

    __slots__ 使用之后类变成静态一样,没有了__dict__, 实例也不可新添加属性

    __getattr__ 在一般的查找属性查找不到之后会调用此函数

    __setattr__ 取代一般的赋值操作,如果有此函数会调用此函数, 如想调用正常赋值途径用 object.__setattr__(self, name, value)

    __delattr__ 同__setattr__, 在del obj.name有意义时会调用

    Magic

    Method

    何时被调用(例子)

    Explanation

    __new__(cls [,...])

    instance = MyClass(arg1, arg2)

    __new__ is called on instance creation

    __init__(self [,...])

    instance = MyClass(arg1, arg2)

    __init__ is called on instance creation

    __cmp__(self, other)

    self == other, self > other, etc.

    Called for any comparison

    __pos__(self)

    +self

    Unary plus sign

    __neg__(self)

    -self

    Unary minus sign

    __invert__(self)

    ~self

    Bitwise inversion

    __index__(self)

    x[self]

    Conversion when object is used as index

    __nonzero__(self)

    bool(self)

    Boolean value of the object

    __getattr__(self, name)

    self.name # name doesn‘t exist

    Accessing nonexistent attribute

    __setattr__(self, name, val)

    self.name = val

    Assigning to an attribute

    __delattr__(self, name)

    del self.name

    Deleting an attribute

    __getattribute__(self, name)

    self.name

    Accessing any attribute

    __getitem__(self, key)

    self[key]

    Accessing an item using an index

    __setitem__(self, key, val)

    self[key] = val

    Assigning to an item using an index

    __delitem__(self, key)

    del self[key]

    Deleting an item using an index

    __iter__(self)

    for x in self

    Iteration

    __contains__(self, value)

    value in self,value not in self

    Membership tests using in

    __call__(self [,...])

    self(args)

    "Calling" an instance

    __enter__(self)

    with self as x:

    with statement context managers

    __exit__(self, exc, val, trace)

    with self as x:

    with statement context managers

    __getstate__(self)

    pickle.dump(pkl_file, self)

    Pickling

    __setstate__(self)

    data = pickle.load(pkl_file)

    Pickling

    原文:http://www.cnblogs.com/tanql/p/3914583.html

    展开全文
  • __ foo __: 定义的是特殊方法,一般是系统定义名字 ,类似 init() 之类的。 _foo: 以单下划线开头的表示的是 protected ...__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。 ...

    __ foo __: 定义的是特殊方法,一般是系统定义名字 ,类似 init() 之类的。

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

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

    展开全文
  • 单下划线、双下划线、头尾双下划线说明: __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似__init__()之类的。 _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身...
     

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

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

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

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

     

     

     

    来自为知笔记(Wiz)



    转载于:https://www.cnblogs.com/jins-note/p/9581662.html

    展开全文
  • __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。 _foo: 以单下划线开头的表示的是 ...__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。  ...
  • Python用下划线作为前缀和后缀指定特殊变量和定义方法,主要有如下四种形式:l单下划线(_)l名称前的单下划线(如:_name)l名称前的双下划线(如:__name)l名称前后的双下划线(如:__init__)(一)单下划线(_)只有单下划线...
  • 单下划线、双下划线、头尾双下划线说明: __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似__init__()之类的。 _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与...
  • 一.前置单下划线 变量前的单下划线表示表面上...前置双下划线表示一个私有属性。 如上图,__name是真正意义上的私有,在外部访问不到,那它是怎么实现这种访问不到的呢?是真的访问不到么? 我们可以通过__dict__...
  • foo: 定义的是特殊方法,一般是系统定义名字 ,类似 init() 之类的。 _foo: 以单下划线开头的表示的是 protected 类型...__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。 ...
  • 1、__foo__: 定义的是特殊方法,一般是系统定义名字,类似__init__()之类 2、_foo:以单划线开头的表示的是protected...3、__foo:以双下划线开头的表示的是private类型的变量或函数,即私有类型,只允许本身访问。 ...
  • 名称前的双下划线:以双下划线开头的属性、方法表示避免父类的属性和方法被子类轻易的覆盖,一般不建议这样定义属性和方法,除非你自己将要做什么。 名称前后的双下划线:这类方法是Python内部.
  • 单下划线与双下划线的区别 内容目录 单下划线与双下划线的区别单下划线(_)名称前的单下划线(如:_name)名称前的双下划线(如:__name)名称前后的双下划线(如:_ init _)总结 单下划线与...
  • 参考地址:[1]Importing `*` in Python[2]理解Python的双下划线命名[3]Pyth详解 Python 中的下划线命名规则http://www.zhihu.com/question/19754941[4]详解 Python 中的下划线命名规则这篇文章讨论Python中下划线_的...
  • python 单下划线跟双下划线使用
  • python中双下划线的作用(1)所有以双下划线开头的成员是私有的(2)python对于私有变量是会进行扎压(mangling)的,扎压规则是原始定义:class A():__function():print '__function is private! '扎压之后:class A():_A...
  • 该代码片段来自Django源码(django/forms/...双下划线开头之前很多人跟我说Python中双下划线开头表示私有,我在很多地方也见到这样的说法。这样理解可能也不能说错,但这不是Python设计双下划线开头的初衷和目的,...
  • 主要介绍了浅谈python 里面的单下划线与双下划线的区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 单下划线、双下划线、头尾双下划线说明: __foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。 _foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行...
  • python类内部部分双下划线特殊方法__setattr__, __getattr__, __delattr__, hasattr __getattribute__ __getitem__(),__setitem__(), __delitem__()主程序如下:classFoo:def_inif(self,pname):self.pname=...
  • python中双下划线和单下划线的区别

    千次阅读 2019-04-02 16:29:55
    1、前后都有双下划线-特殊变量 变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名 2、前面...
  • 1、普通下划线:只是代表一个变量。 2、前置单下划线"_name":变量前的单下划线表示表面上私有 前置下划线的变量和方法代表这个变量和方法最好是只在内部使用。...4、前置双下划线"_ _name":真正的私有 ...
  • _xxx前面加一个下划线,以单下划线开头的表示的是protected类型的变量,即保护类型只能允许其本身与子类进行访问,不能使用from xxx import * 的方式导入。 __xxx__前后两个下划线,魔术方法,一般是python自有,...
  • 1、前后都有双下划线-特殊变量 变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名 2、前面...
  • Python语言学习之双下划线那些事:python和双下划线使用方法之详细攻略 目录 双下划线介绍 1、关于双下划线的函数或方法或属性 双下划线介绍 1、关于双下划线的函数或方法或属性 __name__:...
  • 单下划线 _s : 保护变量 ...双下划线 __s:私有成员 只能类对象自己能访问,子类对象也不能访问 s:python里特殊的专用标识,如__init__() 转载于:https://www.cnblogs.com/rener0424/p/11279325...
  • 1.在python的解释器中,_是上一条语句...单下划线:单下划线的变量是一种程序员之间美丽的约定——只要是这种变量就不要随便在类外部去访问它!!!但是如果我们在导入模块时来看这个单下划线开头的变量,那就不一样...
  • 1.单下划线 变量前的单下划线表示表面上私有 但是其实这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问...
  • 主要给大家介绍了关于Python中单、双下划线区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,134
精华内容 2,053
关键字:

双下划线