IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python中下划线在变量名和方法名中的含义 -> 正文阅读

[Python知识库]Python中下划线在变量名和方法名中的含义

Python中下划线在变量名和方法名中的含义

单下划线和双下划线在Python变量名和方法名中的含义,有些仅仅是作为约定,用于提示开发人员;而另一些则对Python解释器有特殊含义。

python中的下划线主要分为如下几类:

☆前置单下划线,如

_var,主要是用于将变量或方法定义为私有属性。它对于程序员而言是一种提示,这里的私有属性并非如java中的私有,而是一种约定俗成,想强行访问仍旧可以正常访问。

☆后置单下划线,如

var_,主要用于将变量区别,如变量名称和关键字冲突,后面加个下划线区别开来。

☆前置双下划线,如

__var,类中带前置双下划线的变量或方法,都会触发python解释器的名称修饰,是不能直接通过该名称去访问到的,实现了一定程度上的隔离。

☆前后都有双下划线,如

__var__,?常见的有__init__()对象构造函数,这类方法是python中的魔法方法(特殊方法),用于特殊用途。

☆单下划线本身,如

_ 在Python REPLs如IDLE Shell中是一个特殊变量(可以表示一个临时值),它表示解释器计算的最后一个表达式的结果。

下面举例解读之。

前置单下划线

class Test:
    def __init__(self):
        self.foo = 11
        self._bar = 23
#实例化这个类并尝试访问在__init__构造函数中定义的foo和_bar属性,会发生什么情况?
t = Test()
print(t.foo) #输出:11
print(t._bar) #输出:23

可以看到,_bar前面的单下划线并没有阻止我们“进入”这个类访问变量的值。

这是因为Python中的前置单下划线只是一个公认的约定,至少在涉及变量名和方法名时是这样的。但是前置下划线会影响从模块中导入名称的方式。

后置单下划线

有时,某个变量最合适的名称已被Python语言中的关键字占用。因此,诸如class或def的名称不能用作Python中的变量名。在这种情况下,可以追加一个下划线来绕过命名冲突:

def make_object(name, class_):

???? pass

用一个后置单下划线来避免与Python关键字的命名冲突是一个约定。PEP 8定义并解释了这个约定。

前置双下划线

以双下划线开头的Python类属性(变量和方法)不是约定的意义,双下划线前缀会让Python解释器重写属性名称,以避免子类中的命名冲突,这也称为名称改写(name mangling)

class Test:
    def __init__(self):
        self.foo = 11
        self._bar = 23
        self.__baz = 42
#实例化这个类并用内置的dir()函数来看看这个对象的属性:
t = Test()
print(dir(t))
print(t._Test__baz) # 在外部访问__baz变量名时,应使用 _类名__变量名即_Test__baz

运行之,输出:

['_Test__baz', '__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']

42

现在,看一看这个带有对象属性的列表,并留意原始变量名foo、_bar和_ bazi有何差异:

self.foo变量没有改动,在属性列表中显示为foo。

self._bar也一样,在类中显示为_bar。前面说了,在这种情况下前置下划线仅仅是一个约定,是对程序员的一个提示。

对于self.__baz,在该列表中找不到__baz这个变量。仔细观察就会看到,这个对象上有一个名为_Test__baz的属性。这是Python解释器应用名称改写之后的名称,是为了防止子类覆盖这些变量。

对于前置双下划线的变量,在外部访问该变量名时,应使用 _类名__变量名;直接访问__变量名是不存在的。

用双下划线修饰方法亦如此——名称改写也适用于方法名。

用双下划线修饰属性或者方法,会出发名称修饰,即在外部访问时,该方法名或变量名会变为_类名__变量名;直接访问__变量名是不存在的。例子:

class A(object):
    def __init__(self):
        self.__private=10
    def __private_method(self):
        return 'ABC'
t=A()
#下句输出:10,若用print(t.__private)报错:AttributeError: 'A' object has no attribute '__private'
print(t._A__private)
#下句输出:ABC,若用print(t.__private_method())报错:AttributeError: 'A' object has no attribute '__private_method'
print(t._A__private_method()) 

前后都有双下划线

由双下划线包围的变量,则不会发生名称改写,由双下划线包围的方法通常被称为魔法方法(特殊方法)。

前后由双下划线包围的变量不受Python解释器的影响:

class B(object):
    def __init__(self):
        self.__private__=10
t=B()
print(t.__private__) #输出:10

就命名约定而言,最好避免在自己的程序中使用以双下划线开头和结尾的名称,因为Python语言用于定义的特殊方法。

单下划线本身

_ 在Python REPLs如IDLE Shell中是一个特殊变量(可以表示一个临时值),它表示解释器计算的最后一个表达式的结果。

例子:

参考;https://mp.weixin.qq.com/s/Z9BqZrsZVZgSeja9VYdK0w

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 23:01:27  更:2021-07-14 23:01:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:43:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码