首先,单下划线开头,这个常被用于模块中,在一个模块中以单下划线开头的变量和函数被默认当做内部函数,如果使用from  module  import  *导入时,这部分变量和函数不会被导入。注意,如果使用import module导入模块,仍然可以用module._some_var这样的形式访问到这样的对象。

在Python官方推荐的代码样式中,还有一种单下划线结尾的样式,这在解析时并没有特别的含义,但通常用于和Python关键词区分开来,比如,如果我们需要一个变量叫做class,但class是Python关键词,就可以以单下划线结尾,写作class_。

双下划线开头的命名形式,在Python的类成员中使用表示名字改变(name mangling),即如果Student类里有一成员_x,那么dir( Student )时会看到_Student__x而不是__x。这是为了避免该成员的名称与子类中的名称冲突。但要注意:这要求该名称末尾没有下划线。

双下划线开头、双下划线结尾的是Python的特殊变量,“魔术”对象,如__init__、__del__、__add__、__getitem__等,以及全局的__file__、__name__等。Python官方推荐永远不要将这样的命名方式应用于自己的变量或函数,而是按照文档说明来使用。

另外,单下划线开头还有一种一般不会用到的情况,在于使用一个C编写的扩展库,有时会用下划线开头命名,然后使用一个去掉下划线的Python模块进行包装。如struct这个模块实际上是C模块_struct的一个Python包装。

1,_xxx表示的是protected类型的变量,不能用于 from module import *,即保护类型只允许这个类本身与子类进行访问。

2,__xxx表示的是私有类型的变量,只能允许这个类本身进行访问,连子类也不能访问。

3,__xxx__表示特殊变量,如__init__,__del__,__call__

 
 

作者:知乎用户
链接:https://www.zhihu.com/question/19754941/answer/12860775

Python的类的下划线命名的区别的更多相关文章

  1. Python 的类的下划线命名有什么不同?

    1.   以一个下划线开头的命名 ,如_getFile2.  以两个下划线开头的命名 ,如__filename3.  以两个下划线开头和结尾的命名,如 __init__()4.  其它 单下划线前缀的 ...

  2. python:类5——Python 的类的下划线命名有什么不同?

    首先是单下划线开头,这个被常用于模块中,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 from a_module import * 导入时,这部分变量和函数不会被导入.不过值得注 ...

  3. 详解 Python 中的下划线命名规则

    在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线.双下划线.双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题. 1.单下划线(_) 通常情况下,单 ...

  4. python 里面的单下划线与双下划线的区别

    python 里面的单下划线与双下划线的区别 Python 用下划线作为变量前缀和后缀指定特殊变量. _xxx 不能用'from moduleimport *'导入 __xxx__ 系统定义名字 __ ...

  5. python中那些双下划线开头得函数和变量--转载

    Python中下划线---完全解读     Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __x ...

  6. python python中那些双下划线开头的那些函数都是干啥用用的

    1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...

  7. python中那些双下划线开头得函数和变量

    Python中下划线---完全解读     Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __x ...

  8. json字符串中key值下划线命名转换为驼峰命名

    json字符串中key值下划线命名转换为驼峰命名: 例如: 原json串: String json= "{'user_name':'ok','user_sex':0,'object_info ...

  9. python中有两个下划线__的是内置方法,一个下划线_或者没有下划线的可能是属性,也可能是方法,也可能是类名

    python中有两个下划线__的是内置方法,一个下划线_或者没有下划线的可能是属性,也可能是方法,也可能是类名,如果在类中定义的就是类的私有成员. >>> dir(__builtin ...

随机推荐

  1. c# webapi上传、读取、删除图片

    public class FileAPIController : BaseController    {        private readonly string prefix = "t ...

  2. Scala字节数组转换为数字

    1. 2个字节数组转换为整数 def bytes2uint8(_bytes: Array[Byte], _offset: Int): Int = { val b0 = _bytes(_offset) ...

  3. TypeError: '_io.TextIOWrapper' object does not support item assignment

    纯小白 遇到的细节问题: 报错 一开始看到这个傻逼了 TypeError: '_io.TextIOWrapper' object does not support item assignment 其实 ...

  4. Dubbo 泛化调用的参数解析问题及一个强大的参数解析工具 PojoUtils

    排查了3个多小时,因为一个简单的错误,发现一个强大的参数解析工具,记录一下. 背景 Nodejs 通过 tether 调用 Java Dubbo 服务.请求类的某个参数对象 EsCondition 有 ...

  5. python selenium 百度登录

    from selenium import webdriver import time driver = webdriver.Chrome() driver.get("https://www. ...

  6. JS动态添加行列

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Add-Delete Row.a ...

  7. new Date().getTime()和System.currentTimeMillis()的区别

    在Java中,new Date().getTime()和System.currentTimeMillis()都是用来获取当前时间的,并可以用DateFormat转成对应的时间格式,代码如下. impo ...

  8. Invalid bound statement (not found):xxx错误的可能原因

    1,报错信息 log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvir ...

  9. 获取某个元素第一次出现在数组(json数组)的索引

    function firstIndex(arr, text) { // 若元素不存在在数组中返回-1 let firstVal = -1; for (let i = 0; i < arr.len ...

  10. k8s构建镜像-基于centos的python环境+pip

    FROM centos:7.4.1708 #维护者信息MAINTAINER by icdss # 标签LABEL version="1.0" # 安装依赖RUN yum -y up ...