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

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

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

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

    展开全文
  • 平时写代码经常碰到下划线、双下划线等“奇怪”的写法,今天特意花时间彻底解决这个问题 文章目录前置单下划线:_var后置单下划线:var_前置双下划线 前置单下划线:_var 意义:python社区约定好单下划线表达的是...

    平时写代码经常碰到下划线、双下划线等“奇怪”的写法,今天特意花时间彻底解决这个问题。文章内容主要参考《深入理解Python特性》一书。


    前置单下划线:_var

    意义:python社区约定好单下划线表达的是某种意思,本身不会影响程序的行为

    1. PEP8中定义:以单个下划线开头的变量或方法只在内部使用
    2. 这个符号对python解释器没有什么用,它只是个小小的提示:这个变量或方法并不是这个类的公共接口,最好不要使用它——(因为python中没有严格界定“私有”和“公有”变量,因此下划线可以作为提示)
    3. 使用通配符导入模块Python不会导入带有前置但下划线的名称,除非模块中定义了__all__列表覆盖了这个行为,举个例子:
    # test_import.py文件内容
    def hello():
        print('Hello, world!')
    
    
    def _world():
        print('Hello, world!')
    
    
    >>> from test_import import *
    >>> hello()
    Hello, world!
    >>> _world()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name '_world' is not defined
    

    后置单下划线:var_

    意义:名称被Python语言中的关键字占用的时候,就可以使用,比如classdef这些,使用class_def_代替


    前置双下划线:__var

    这个估计经常遇到

    意义:告诉python解释器重写属性名称,避免子类中的命名冲突。

    1. 也称为:名称改写(name mangling)
    2. dir()可以查看对象的属性和方法
    3. 注意类似__bar前面双下划线的方法和变量,
    class Test:
       def __init__(self):
           self.foo = 12
           self._bar = 24
           self.__bar = 43
    
    class ExtendedTest(Test):
       def __init__(self):
           super(ExtendedTest, self).__init__()
           self.foo = 'hello'
           self._bar = 'world'
           self.__bar = 'down'
    

    当创建ExtendedTest类的实例t时,调用t.__bar会报错AttributeError: 'ExtendedTest' object has no attribute '__bar'
    具体来看一下原因:输入dir(t)

    >>> dir(t)
    ['_ExtendedTest__bar', '_Test__bar', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__
    ', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_bar', 'foo']
    

    我们发现t没有__bar属性,而是变成了_ExtendedTest__bar_Test__bar这是因为Python进行了名称重写
    继续输入:t._ExtendedTest__bart__Test__bar,出现了down43

    >>> t._ExtendedTest__bar
    'down'
    >>> t._Test__bar
    43
    
    1. 我们无法察觉双下划线名称的改写,也就是我们无法通过t.__bar直接访问__bar的值,只能借的类方法去访问或者是通过t._ExtendedTest__bar。类似举例如下:
    class ManglingTest:
      def __init__(self):
          self.__mangled = 'hello'
    
      def get_mangled(self):
          return self.__mangled
    
    >>> ManglingTest().get_mangled()
    'hello'
    >>> ManglingTest().__mangled
    AttributeError: "'ManglingTest' object has no attribute '__mangled'"
    
    1. 名称改写也适用于方法名。
    class MangledMethod:
      def __method(self):
          return 42
    
      def call_it(self):
          return self.__method()
    
    >>> MangledMethod().__method()
    AttributeError: "'MangledMethod' object has no attribute '__method'"
    >>> MangledMethod().call_it()
    42
    
    1. 还有更神奇的用法:由于名称的改写,因此类中test()方法用__mangled就可以访问在MangledGlobal类中访问全局变量_MangledGlobal__mangled,因为Python的名称改写自动扩展了变量名。
    _MangledGlobal__mangled = 23
    
    class MangledGlobal:
      def test(self):
          return __mangled
    
    >>> MangledGlobal().test()
    23
    

    前后双下划线:__ var__

    意义:如果使用前后双下划线,那么则不会发生名字重写,不受python解释器的影响

    1. 双下划线方法称为魔法方法,最好避免在自己程序中使用双下划线开头和结尾的名称,避免于python语言未来版本变更发生冲突。
    2. python里面有很多内置方法,如:__hash____iter____dict____repr__等其他内置函数,都是用前后双下划线

    单下划线:_

    1. 表明变量是临时的或者无关紧要
    for _ in range(10):
    	print('Hello, world! ')
    
    1. 表示解释器计算的上一个表达式的结果
    >>> 20 + 3
    23
    >>> _
    23
    >>> print(_)
    23
    
    >>> list()
    []
    >>> _.append(1)
    >>> _.append(2)
    >>> _.append(3)
    >>> _
    [1, 2, 3]
    

    总结:

    1. 前置单下划线_var:命名约定,表明仅在内部使用(在通配符import * 的时候会有小小的区别),一般对python解释器没有特殊的含义
    2. 后置单下划线:var_:命名约定,避免与python关键字命名冲突
    3. 前置双下划线:__var:名称重写,在类环境中使用会触发名称改写,对python解释器有影响
    4. 前后双下划线:__var__:python定义的魔法方法,在自定义属性中逼民啊用这种命名方式
    5. 单下划线:_:表明变量是临时的或者无关紧要。此外还可以表示Python REPL会话中的上一个结果。

    结束了…

    展开全文
  • class test: _name = "hello" __name = "world" ... File "test_python_下划线.py", line 6, in print (test.__name) AttributeError: type object 'test' has no attribute '__name'  

    请参考https://blog.csdn.net/u013205877/article/details/77427785

    class test:
        _name = "hello"
        __name = "world"
    
    print (test._name)
    print (test.__name)

    运行结果如下:

    hello
    Traceback (most recent call last):
      File "test_python_下划线.py", line 6, in <module>
        print (test.__name)
    AttributeError: type object 'test' has no attribute '__name'

     

    展开全文
  • 主要介绍了Python中使用双下划线防止类属性被覆盖,需要的朋友可以参考下
  • _xx:前置单下划线 — 口头私有变量,私有化属性或方法,一般来讲,变量名_xx被看作是“私有 的”,在模块或类外不可以使用。当变量是私有的时候,用_xx 来表示变量是很好的习惯。类对象和子类可以访问,这并不能完全...
    1. xx : 公有变量

    2. _xx:前置单下划线 — 口头私有变量,私有化属性或方法,一般来讲,变量名_xx被看作是“私有 的”,在模块或类外不可以使用。当变量是私有的时候,用_xx 来表示变量是很好的习惯。类对象和子类可以访问,这并不能完全做到真正的私有,只是约定俗成的而已,这样写表示不希望这个变量在外部被直接调用。意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

    3. __xx:前置双下划线 — 私有变量,私有化属性或方法,无法在外部直接访问(名字重整所以访问不到,只能是允许这个类本身进行访问了。连子类也不可以)。

    • 双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_KaTeX parse error: Expected group after '_' at position 12: {classname}_̲_name,所以,仍然可以通过…{classname}__name来访问__name变量。但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把__name改成不同的变量名。
    1. __ xx__:前后双下划线 — 特殊变量,系统定义名字(这就是在python中强大的魔法方法),因为变量名__xxx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。

    2. xx_:后置单下划线,用于避免与Python关键词的冲突。


    参考文章:https://zhuanlan.zhihu.com/p/53469919

    展开全文
  • 1、__foo__: 定义的是特殊方法,一般是系统定义名字,类似__init__()之类 2、_foo:以单划线开头的表示的是protected...3、__foo:以双下划线开头的表示的是private类型的变量或函数,即私有类型,只允许本身访问。 ...
  • foo: 定义的是特殊方法,一般是系统定义名字 ,类似 init() 之类的。 _foo: 以单下划线开头的表示的是 protected 类型...__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。 ...
  • 一.前置单下划线 变量前的单下划线表示表面上...前置双下划线表示一个私有属性。 如上图,__name是真正意义上的私有,在外部访问不到,那它是怎么实现这种访问不到的呢?是真的访问不到么? 我们可以通过__dict__...
  • 例如![图片](https://img-ask.csdn.net/upload/201708/11/1502436602_333500.jpg)
  • python中双下划线和单下划线的区别

    千次阅读 2019-04-02 16:29:55
    1、前后都有双下划线-特殊变量 变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name__、__score__这样的变量名 2、前面...
  • 1.单下划线 变量前的单下划线表示表面上私有 但是其实这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问...
  • 在看一些Python开源代码时,经常会看到以下划线或者双下划线开头的方法或者属性,到底它们有什么作用,又有什么样的区别呢?今天我们来总结一下(注:下文中的代码在Python3下测试通过) _ 的含义 在python的类中...
  • 单下划线的作用: 以单下划线("_")开头的模块变量或者...当然还有两边都有双下划线的例如__main__ , 这个一般都是系统的定义使用的,我们可以可以这样定义,不过为了不和系统的有什么冲突,换是不要这样定义的好(如果头
  • 单下划线与双下划线的区别 内容目录 单下划线与双下划线的区别单下划线(_)名称前的单下划线(如:_name)名称前的双下划线(如:__name)名称前后的双下划线(如:_ init _)总结 单下划线与...
  • 1、单下划线开头的变量:半私有变量 以此类名称命名的对象,需要分为两种情况: 类外:类外的半私有对象、私有对象...2、双下划线开头的变量:私有变量 也需要分为两种情况: 类外: 与半私有对象相同 类中: .
  • 本文实例讲述了django框架基于queryset和双下划线的跨表查询操作。分享给大家供大家参考,具体如下: 前面篇随笔写的是基于对象的跨表查询:对象.objects....这篇随笔主要写的是基于双下划线的跨表查询,其本质是使用j
  • 什么有的内核函数前面会有“_ ”双下划线 在我们阅读内核代码时,经常会看到有的函数名称前面会带有“ _”的双下划线,而有些又没有,这个有什么用呢? 原来内核API函数具有这种名称的,通常都是一些接口的底层...
  • Python语言学习之双下划线那些事:python和双下划线使用方法之详细攻略 目录 双下划线介绍 1、关于双下划线的函数或方法或属性 双下划线介绍 1、关于双下划线的函数或方法或属性 __name__:...
  • 定义和用法 __construct() 函数创建一个新的 SimpleXMLElement 对象。 如果成功,则该函数返回一个对象。如果失败,则返回 false。 语法__construct(data,options,is_url,ns,is_prefix) ...形式良好的 XML 字符串或 ...
  • 主要介绍了浅谈python 里面的单下划线与双下划线的区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • __xx:前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到),类对象和子类不能访问 __xx__:前后下划线,用户名字空间的魔法对象或属性。例如:__init__, __ 尽量不要自定...
  • _xxx前面加一个下划线,以单下划线开头的表示的是protected类型的变量,即保护类型只能允许其本身与子类进行访问,不能使用from xxx import * 的方式导入。 __xxx__前后两个下划线,魔术方法,一般是python自有,...
  • C语言中双下划线__的作用 以单下划线(_)表明是标准库的变量 双下划线(__) 开头表明是编译器的变量 所以 双下划线__只是C语言的一个合法标识符 不一定是变量, 也可以是函数,宏等。 同时双下划线(__)多用于告...
  • Python下划线命名模式 - 小结 以下是一个简短的小结,即“速查表”,罗列了我在本文中谈到的五种Python下划线模式的含义: ---------------------------------------------------------------------------------...
  • python 单下划线与双下划线的区别

    千次阅读 2019-07-22 21:33:32
    1.单前导下划线 _xxx:  变量前面使用单下划线,用于指定该名称为“私有”。为方便自己或者阅读代码的人知道以“_”开头的名称只供内部使用,也就是说,如果你写如下代码: from xxx import *,此时以“_”开头的...
  • 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义。 其实如果足够了解一些知识,知道自己想要...
  • Android TextView出现双下划线

    千次阅读 2019-10-18 14:14:39
    在华为机型荣耀V10中Android版本9.0使用普通的方式设置下划线,却出现了双下划线的现象。 二、TextView设置下划线方式 正常情况下可以有五种设置下划线 1.字符串资源中设置下划线属性(用<u>标签,最简单的...
  • 文章目录 起因 C/C++中单/双下划线 C/C++预编译内置宏 单下划线和双下划线 其他 python中单/双下划线 python中单下划线 单下划线单独使用 可以做占位符 在命令行窗口_可以表示前一步的计算结果 可以作为不存在的分隔...
  • 主要给大家介绍了关于Python中单、双下划线区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 121,720
精华内容 48,688
关键字:

双下划线是什么