加下划线的变量

Python
作者

yangjh

发布日期

November 23, 2022

某些标识符类(除了关键字)具有特殊含义。这些类的命名模式以下划线字符开头,并以下划线结尾:

1 语法解读

1.1 _*

_*,表示不会被 from module import * 所导入。

1.2 _

  • *_在 match 语句内部的 case 模式中,_ 是一个 软关键字,它表示通配符。
  • 在此之外,交互式解释器会将最后一次求值的结果放到变量 _ 中。 (它与 print 等内置函数一起被存储于 builtins 模块。)
  • 在其他地方,_ 是一个常规标识符。 它常常被用来命名 “特殊” 条目,但对 Python 本身来说毫无特殊之处。开发人员常用下划线表示改变私有变量,不希望被外部直接访问的变量,但是从语法上,这种加了一个下划线的变量依旧是可以从外部访问的,是一种伪私有变量。
  • 它还经常被用来命名无需使用的变量。

1.3 __*__

若变量名称前后都有双下划线,则表示系统定义的名称,通常简称为 “dunder” 。这些名称由解释器及其实现(包括标准库)定义,并全局可用。

部分内置变量如下:

属性 含意
__doc__ 该函数的文档字符串,没有则为 None;不会被子类继承。
__name__ 该函数的名称。
__qualname__ 该函数的 qualified name
__module__ 该函数所属模块的名称,没有则为 None
__defaults__ 由具有默认值的参数的默认参数值组成的元组,如无任何参数具有默认值则为 None
__code__ 表示编译后的函数体的代码对象。
__globals__ 对存放该函数中全局变量的字典的引用
__dict__ 命名空间支持的函数属性。
__closure__ None 或包含该函数可用变量的绑定的单元的元组
__annotations__ 包含形参标注的字典。
__kwdefaults__ 仅包含关键字参数默认值的字典。
___self__ 为类实例对象本身
__func__ 为函数对象

1.4 __*

在类中,使用前双下划线表示类的私有名称。类定义时,此类名称以一种混合形式重写,以避免基类及派生类的 “私有” 属性之间产生名称冲突。私有变量不能在外部访问。

2 案例

class MyName:
    _name = "WinerChan111"      # 伪私有变量
    __namedede = "WinerChan222" # 私有变量
    
  def get_namedede(self):   
    return self.__namedede   
  
  def set_namedede(self,s):  
    self.__namedede = s
  
  
print(MyName._name)
print(MyName.__namedede)

#############输出#######################
>>> 
>>> class MyName:
...     _name = "w1"
...     __namedede = "w2"
... 
>>> print(MyName._name)
w1
>>> print(MyName.__namedede)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'MyName' has no attribute '__namedede'
>>>

3 参考文献

2. 词法分析 — Python 3.10.5 文档

回到顶部