python中各种下划线(_xxx、__xxx__ 、__xxx)的含义

本文详细介绍了Python中使用下划线前缀和后缀的特殊变量及其用途,包括保护变量、私有变量及语言定义的特殊方法。同时列举了一系列内置方法如__init__(), __str__(), __add__()等,并解释了它们的调用方式和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python 用下划线作为变量前缀和后缀指定特殊变量,主要有以下几种:

_xxx   :保护变量,意思是只有类对象和子类对象能够访问到这些变量(尽量避免在类外部直接修改)

__xxx__ :python语言定义的特殊方法

__xxx  :类中的私有变量名

核心风格:避免用下划线作为变量名的开始

类的基础方法
序号    目的                                   所编写代码                   Python 实际调用
①    初始化一个实例                   x = MyClass()                   x.__init__()
②    字符串的“官方”表现形式         repr(x)                           x.__repr__()
③    字符串的“非正式”值                 str(x)                             x.__str__()
④    字节数组的“非正式”值            bytes(x)                          x.__bytes__()
⑤    格式化字符串的值            format(x,format_spec)         x.__format__(format_spec)

  1. 对 __init__() 方法的调用发生在实例被创建 之后 。如果要控制实际创建进程,请使用 __new__()方法。
  2. 按照约定, __repr__() 方法所返回的字符串为合法的 Python 表达式。
  3. 在调用 print(x) 的同时也调用了 __str__() 方法。
  4. 由于 bytes 类型的引入而从 Python 3 开始出现。

python中以双下划线的是一些系统定义得名称,让python以更优雅得语法实行一些操作,本质上还是一些函数和变量,与其他函数和变量无二。
比如x.__add__(y) 等价于 x+y
有一些很常见,有一些可能比较偏,在这里罗列一下,做个笔记,备忘。
x.__contains__(y) 等价于 y in x, 在list,str, dict,set等容器中有这个函数
__base__, __bases__, __mro__, 关于类继承和函数查找路径的。
class.__subclasses__(), 返回子类列表
x.__call__(...) == x(...)
x.__cmp__(y) == cmp(x,y)
x.__getattribute__('name') == x.name == getattr(x, 'name'),  比__getattr__更早调用
x.__hash__() == hash(x)
x.__sizeof__(), x在内存中的字节数, x为class得话, 就应该是x.__basicsize__
x.__delattr__('name') == del x.name
__dictoffset__ attribute tells you the offset to where you find the pointer to the __dict__ object in any instance object that has one. It is in bytes.
__flags__, 返回一串数字,用来判断该类型能否被序列化(if it's a heap type), __flags__ & 512
S.__format__, 有些类有用
x.__getitem__(y) == x[y], 相应还有__setitem__, 某些不可修改类型如set,str没有__setitem__
x.__getslice__(i, j) == x[i:j], 有个疑问,x='123456789', x[::2],是咋实现得
__subclasscheck__(), check if a class is subclass
__instancecheck__(), check if an object is an instance
__itemsize__, These fields allow calculating the size in bytes of instances of the type. 0是可变长度, 非0则是固定长度
x.__mod__(y) == x%y, x.__rmod__(y) == y%x
x.__module__ , x所属模块
x.__mul__(y) == x*y,  x.__rmul__(y) == y*x

__reduce__, __reduce_ex__ , for pickle

__slots__ 使用之后类变成静态一样,没有了__dict__, 实例也不可新添加属性

__getattr__ 在一般的查找属性查找不到之后会调用此函数

__setattr__ 取代一般的赋值操作,如果有此函数会调用此函数, 如想调用正常赋值途径用 object.__setattr__(self, name, value)

__delattr__ 同__setattr__, 在del obj.name有意义时会调用

 
原文:https://blog.csdn.net/qq_14935437/article/details/82746257 

<think>嗯,用户想了解下划线变量_在编程中的作用和常见场景,特别是Python里的用法。首先,我需要回忆下Python下划线的不同用法。根据之前看到的引用,下划线有多种用途,比如临时变量、私有变量、国际化函数等等。 首先,单独的下划线_,通常用作临时变量或者表示不关心的值。比如在循环中,如果不需要用到迭代变量,可以用_代替。或者解包元组时忽略某些值。引用3和4提到这个情况,需要确认是否正确。 然后是单前导下划线_var,表示模块或类内部的私有变量,这是一种约定,并不是强制性的。引用2提到用_xxx表示私有变量,可能用户也会想知道这个部分。这里需要解释这是Python的命名约定,外部不应该直接访问。 双前导下划线__var,会触发名称修饰,变成_类名__var,用于类的属性,避免子类命名冲突。这可能需要详细说明,因为这是Python特有的机制。 双前后下划线__var__,是特殊方法或属性,比如__init__,__name__等。用户可能知道这些魔术方法,但需要明确这类命名是保留的,用户不应自定义这样的名称。 还有在国际化中的使用,比如_()函数用作翻译标记,引用1提到这点。这部分可能用户在使用Django或其他框架时遇到,需要举例说明。 另外,REPL中的_表示最后一次计算结果,引用4详细解释了这一点,这在交互式环境中很常见,用户可能在测试时代码中遇到。 用户的问题可能不仅仅是知道这些用法,还可能想知道实际应用场景和注意事项。比如为什么会有这些约定,如何正确使用,避免错误。 可能需要分点回答,结构清晰,每个用法举例说明。同时要注意引用对应的参考资料,比如引用1到4,确保信息准确。 还要考虑用户可能的困惑点,比如单下划线和双下划线的区别,名称修饰的具体机制,以及私有变量的实际访问方式。需要用简单易懂的语言解释,避免过于技术化。 最后,生成相关问题,引导用户进一步学习,比如下划线在类中的作用,国际化中的具体应用,名称修饰的原理等。确保问题覆盖用户可能感兴趣的方面。</think>### 下划线变量 `_` 在编程中的作用与常见场景 下划线变量 `_` 在编程中有多种含义,具体作用取决于上下文环境和编程语言。以下是其在 Python 中的核心用法和典型场景: --- #### 1. **临时变量或忽略值** - **作用**: 表示一个临时变量或不需要使用的值,增强代码可读性。 - **示例**: ```python for _ in range(5): # 忽略循环变量 print("Hello") a, _, b = (1, 2, 3) # 忽略中间值 ``` - **应用场景**: 循环中不需要迭代变量时,或元组解包时忽略部分值[^3]。 --- #### 2. **国际化(i18n)翻译标记** - **作用**: 作为函数名 `_()`,用于标记需要翻译的字符串。 - **示例**: ```python from gettext import gettext as _ print(_("Hello World")) # 输出翻译后的字符串 ``` - **应用场景**: 多语言支持项目中,配合工具提取待翻译文本[^1]。 --- #### 3. **私有变量/方法的前导符** - **作用**: 单下划线 `_var` 表示模块或类内部的“私有”成员(约定非强制)。 - **示例**: ```python class MyClass: def __init__(self): self._internal_data = 42 # 约定为内部使用 ``` - **注意**: 双下划线 `__var` 触发名称修饰(Name Mangling),如 `__var` 会被改为 `_ClassName__var`[^2]。 --- #### 4. **交互式环境(REPL)的特殊变量** - **作用**: 保存最后一次表达式的结果。 - **示例**: ```python >>> 3 + 5 8 >>> _ * 2 # 使用上一次结果 16 ``` - **应用场景**: 快速测试、调试或探索性编程[^4]。 --- #### 5. **特殊方法或属性的标识** - **作用**: 双前后下划线 `__var__` 表示语言内置的特殊方法或属性。 - **示例**: ```python class MyClass: def __init__(self): self.__hidden = "secret" # 名称修饰后的私有变量 def __str__(self): # 内置方法 return "MyClass instance" ``` - **注意**: 用户不应自定义此类名称,避免与语言特性冲突。 --- #### 6. **占位符或模式匹配(Python 3.10+)** - **作用**: 在模式匹配中作为通配符。 - **示例**: ```python match value: case (_, y): # 忽略第一个元素 print(f"Y is {y}") ``` --- ### 总结表格 | 下划线形式 | 作用场景 | 示例 | |-----------------|------------------------------|--------------------------| | `_` | 忽略临时值 | `a, _, b = (1,2,3)` | | `_var` | 约定私有成员 | `self._internal_data` | | `__var` | 触发名称修饰 | `self.__hidden` | | `__var__` | 特殊方法/属性 | `__init__`, `__name__` | | `_()` | 国际化翻译函数 | `_("Text to translate")` |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值