精华内容
下载资源
问答
  • 意义:python社区约定好单下划线表达的是某种意思,本身不会影响程序行为 PEP8中定义:以单个下划线开头变量或方法只在内部使用 这个符号对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会话中的上一个结果。

    结束了…

    展开全文
  • 见过一个大佬写代码这样: user: User = User.objects.filter(id=data.get('uid')).first() 变量名后面冒号:类型注解,3.6以后加入,冒号右边类型,仅仅注释,有些鸡肋 变量注释语法:注释...

    见过一个大佬写的代码是这样的:

    user: User = User.objects.filter(id=data.get('uid')).first()

    变量名后面的冒号是:类型注解,3.6以后加入的,冒号右边是类型,仅仅是注释,有些鸡肋

    变量注释的语法:注释变量类型,明确指出变量类型,方便帮助复杂案例中的类型推断。

    var: type = value  其实本质上就是  var = value  # type就是var期望的类型

    类型注释只是一种提示,并非强制的,Python解释器不会去校验value的类型是否真的是type

    例如:a: str = 10  这样是没有错的,python解释器在执行时会把a当作int来操作(type(a)——int)。      这不像是 C 语言中 int a(a必须是int类型)。

    参考连接:

    https://zhidao.baidu.com/question/1930988314448559867.html

    展开全文
  • python中 int类型数占据内存大小

    千次阅读 2019-05-25 22:56:09
    python3版本为例说明, int 类型在python中是动态长度。因为python3中int类型是长整型,理论支持无限大数字,但它结构其实也很简单, 在 longintepr.h ...这结构是什么意思呢,重点在于 ob_digit 它是一个数...

    以python3版本为例说明, int 类型在python中是动态长度的。因为python3中int类型是长整型,理论支持无限大的数字,但它的结构其实也很简单, 在 longintepr.h 中定义:

    struct _longobject {
        PyObject_VAR_HEAD
        digit ob_digit[1];
    };
    

    这结构是什么意思呢,重点在于 ob_digit 它是一个数组指针。digit 可认为是 int的别名。python的整型存储机制是这样的。比方要表示一个很大的数:123456789 。而每个元素最大只能表示3位十进制数(为理解打的比方)。那么python就会这样存储:

    ob_digit[0] = 789
    ob_digit[1] = 456
    ob_digit[2] = 123
    

    低位存于低索引下。python中整型结构中的数组,每个元素最大存储 15 位的二进制数(不同位数操作系统有差异32位系统存15位,64位系统是30位)。

    因此,sys.getsizeof(0) 数组元素为0。此时占用24字节(PyObject_VAR_HEAD 的大小)。 sys.getsizeof(456) 需使用一个元素,因此多了4个字节。

    转载于:https://blog.csdn.net/mjl960108/article/details/80191308

    展开全文
  • 目录 ... 它是对程序员一个提示 - 意味着Python社区一致认为它应该是什么意思,但程序行为不受影响。 单末尾下划线 var_ 双前导下划线 __var 到目前为止,我们所涉及所有命名模式...

    单前导下划线 _var
    当涉及到变量和方法名称时,单个下划线前缀有一个约定俗成的含义。 它是对程序员的一个提示 - 意味着Python社区一致认为它应该是什么意思,但程序的行为不受影响。

    下划线前缀的含义是告知其他程序员:以单个下划线开头的变量或方法仅供内部使用。 该约定在PEP 8中有定义。

    单末尾下划线 var_

    有时候,一个变量的最合适的名称已经被一个关键字所占用。 因此,像class或def这样的名称不能用作Python中的变量名称。 在这种情况下,你可以附加一个下划线来解决命名冲突。总之,单个末尾下划线(后缀)是一个约定,用来避免与Python关键字产生命名冲突。 PEP 8解释了这个约定。

    双前导下划线 __var
    到目前为止,我们所涉及的所有命名模式的含义,来自于已达成共识的约定。 而对于以双下划线开头的Python类的属性(包括变量和方法),情况就有点不同了。

    双下划线前缀会导致Python解释器重写属性名称,以避免子类中的命名冲突。

    这也叫做名称修饰(name mangling) - 解释器更改变量的名称(例如:class名为Test, 变量名为__a,那么__a会被Python解释器重写属性名为_Test__a),以便在类被扩展的时候不容易产生冲突。名称修饰会影响在一个类的上下文中,以两个下划线字符("dunders")开头的所有名称。

    双前导和双末尾下划线 var

    如果一个名字同时以双下划线开始和结束,则不会应用名称修饰。 由双下划线前缀和后缀包围的变量不会被Python解释器修改。

    单下划线 _
    按照习惯,有时候单个独立下划线是用作一个名字,来表示某个变量是临时的或无关紧要的。你也可以在拆分(unpacking)表达式中将单个下划线用作“不关心的”变量,以忽略特定的值。 同样,这个含义只是“依照约定”,并不会在Python解释器中触发特殊的行为。 单个下划线仅仅是一个有效的变量名称,会有这个用途而已。

    除了用作临时变量之外,“_”是大多数Python REPL中的一个特殊变量,它表示由解释器评估的最近一个表达式的结果。

    Python下划线命名模式 - 小结

    2343579122.pngevernotecid://9326179B-5200-4478-B32E-B919B94B243C/appyinxiangcom/21231346/ENResource/p4

    转载于:https://www.cnblogs.com/daryl-blog/p/11003054.html

    展开全文
  • 单前导下划线:_var 单末尾下划线:var_ 双前导下划线:__var 双前导和末尾下划线:__var... 它是对程序员一个提示 - 意味着Python社区一致认为它应该是什么意思,但程序行为不受影响。 下划线前缀含义是告知
  • 他们到底是什么?首先,我先告诉大家一个事实,完整地写*args和**kwargs是不必要,我们可以只写*和**。你也可以写*var和**vars。写*args和**kwargs只是一个大家都遵守习惯。那现在让我们从*args讲起。*args...
  • 它是对程序员一个提示 - 意味着Python社区一致认为它应该是什么意思,但程序行为不受影响。下划线前缀含义是告知其他程序员:以单个下划线开头变量或方法仅供内部使用。 该约定在PEP 8中有定义。 2. 单末尾...
  • 它是对程序员一个提示 – 意味着Python社区一致认为它应该是什么意思,但程序行为不受影响。 下划线前缀含义是告知其他程序员:以单个下划线开头变量或方法仅供内部使用。 该约定在PEP 8中有定义。 这不是...
  • python中五种下划线 _

    2021-04-18 01:05:12
    python中五种下划线 “_” 单前导下划线:_var 单末尾下划线:var_ 双前导下划线:__var ... 它是对程序员一个提示 - 意味着Python社区一致认为它应该是什么意思,但程序行为不受影响。 下划线前
  • python--基础知识点--int所占字节长度

    千次阅读 2020-09-03 18:37:07
    python3版本为例说明, int 类型在python中是动态长度。...这结构是什么意思呢,重点在于 ob_digit 它是一个数组指针。digit 代表是是python int。python中整型结构中数组,每个元素最大存储 15
  • python字符串很像java中数组,当创建了一个新字符串后,就类似于创建了一个数组,可以通过位置访问字符串子串, var=‘sdfsdf’ var[1] //d var[1:5] //dfsd 字符串连接 用‘+’就可以连接了 转义字符 ...
  • 那么它们到底是什么? 首先让我告诉你, 其实并不是必须写成*args 和**kwargs。 只有变量前面 *(星号)才是必须. 你也可以写成*var 和**vars. 而写成*args 和**kwargs只是一个通俗命名约定。 *args 用法 *args ...
  • 有没有问想过这是什么意思?其它语言也有“一切皆对象”之说,如Python。但是Python对象不仅仅是像JS对象这样存放值和值容器。Python对象是一个类。JS中有类似东西,但JS中“对象”只是键和值容器...
  • js一切皆对象

    2019-10-15 14:24:01
    有没有问想过这是什么意思? 其它语言也有“一切皆对象”之说,如Python。 但是Python对象不仅仅是像JS对象这样存放值和值容器。Python对象是一个类。 JS中有类似东西,但JS中“对象”只是键和值...
  • 目前所有版本JS JSP ASP .NET J2AM 都提供源代码,对于一些脚本语言来说,直接解压缩之后就可以使用了,不需要什么安装步骤。另外一些需要编译语言,则提供了编译用 shell 文件(Linux/Unix 下使用)和 ...
  • 目前所有版本JS JSP ASP .NET J2AM 都提供源代码,对于一些脚本语言来说,直接解压缩之后就可以使用了,不需要什么安装步骤。另外一些需要编译语言,则提供了编译用 shell 文件(Linux/Unix 下使用)和 ...
  • 目前所有版本JS JSP ASP .NET J2AM 都提供源代码,对于一些脚本语言来说,直接解压缩之后就可以使用了,不需要什么安装步骤。另外一些需要编译语言,则提供了编译用 shell 文件(Linux/Unix 下使用)和 ...
  • 目前所有版本JS JSP ASP .NET J2AM 都提供源代码,对于一些脚本语言来说,直接解压缩之后就可以使用了,不需要什么安装步骤。另外一些需要编译语言,则提供了编译用 shell 文件(Linux/Unix 下使用)和 ...
  • 目前所有版本JS JSP ASP .NET J2AM 都提供源代码,对于一些脚本语言来说,直接解压缩之后就可以使用了,不需要什么安装步骤。另外一些需要编译语言,则提供了编译用 shell 文件(Linux/Unix 下使用)和 ...
  • 目前所有版本JS JSP ASP .NET J2AM 都提供源代码,对于一些脚本语言来说,直接解压缩之后就可以使用了,不需要什么安装步骤。另外一些需要编译语言,则提供了编译用 shell 文件(Linux/Unix 下使用)和 ...
  • 目前所有版本JS JSP ASP .NET J2AM 都提供源代码,对于一些脚本语言来说,直接解压缩之后就可以使用了,不需要什么安装步骤。另外一些需要编译语言,则提供了编译用 shell 文件(Linux/Unix 下使用)和 ...
  • 请问这是什么意思以及为何会发生此错误? 除此之外,我亦尝试将"/bin/sh"加入到sudoer file中: "ianyc ALL=(ALL) /bin/ls, /bin/sh" 如此一来,Ansible是可以执行,但是问题就会变成... "不止sudo ls...
  • 这种语言没学过,看不懂什么意思,求大神指点,卡这很久了 下面日志 This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake....
  • # 这是深度学习入门这本书里一段代码,请问这个问题是什么意思以及怎样解决? 报错如下:(下面有源代码)Python 3.7.3 (default, Mar 27 2019, 17:13:21) [MSC v.1915 64 bit (AMD64)] on win32 runfile('E:/...
  • 元素为0表示对应变量连续;1表示离散) lb = [-1.5, -1.5, 0, 0, 0, 0] + [0] * 60 # 决策变量下界 ub = [2.5, 2.5, 63, 63, 63, 63] + [63] * 60 # 决策变量上界 # 此处...

空空如也

空空如也

1 2
收藏数 27
精华内容 10
关键字:

python的var是什么意思

python 订阅