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

本文详细解释了Python中不同下划线前缀的命名规则及其意义,包括单下划线、双下划线以及魔术方法的用途,并介绍了这些规则如何帮助避免命名冲突。

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

转自:http://www.cnblogs.com/pylemon/archive/2011/07/08/2100778.html

1,以一个下划线开头的命名 ,如_getFile
2,以两个下划线开头的命名 ,如__filename
3,以两个下划线开头和结尾的命名,如 __init__()
4,其它
这些命名有什么不同吗
首先是单下划线开头,这个被常用于模块中,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 from a_module import * 导入时,这部分变量和函数不会被导入。不过值得注意的是,如果使用 import a_module 这样导入模块,仍然可以用 a_module._some_var 这样的形式访问到这样的对象。

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

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

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

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

更多关于命名的内容可以参考 PEP 8 《代码风格指南》的 Name Conventions 一节: http://www.python.org/dev/peps/pep-0008/

需要说明的是,由于这份文档看起来经过多次修改,双下划线开头的用法似乎曾经如 @makestory 所说,建议为类的私有成员,至少啄木鸟社区的 PEP 8 译文是这样写的,但 PEP 8 当前的官方版本中并没有体现。


### Python 中单下划线与双下划线的区别 #### 单下划线 `_variable` 在 Python 编码约定中,以单个下划线开头的成员名(如 `_object`),通常表示该成员是受保护的或私有的。这种命名方式是一种惯例,并不强制执行访问控制;它更多是为了提醒开发者这些属性不应该直接访问。 ```python class Example: def __init__(self): self._private_var = "This is a protected variable" example_instance = Example() print(example_instance._private_var) # 虽然可以访问,但这不符合编码规范 ``` #### 双下划线 `__variable` 当中的属性名以前置双下划线定义时(如 `__object`),Python 解释器会对这个名称进行重写处理,即所谓的“名称改写”(name mangling),目的是为了防止子意外覆盖基的方法或属性[^2]。 ```python class BaseClass: def __init__(self): self.__mangled_variable = "Mangled Variable" base_instance = BaseClass() # 尝试直接访问会引发 AttributeError 错误 try: print(base_instance.__mangled_variable) except AttributeError as e: print(f"Error: {e}") # 实际上可以通过特定的方式访问到被改写的变量 print(base_instance._BaseClass__mangled_variable) # 输出 Mangled Variable ``` #### 特殊方法 `__method__` 对于前后都带有双下划线的形式(如 `__object__`),这标识符被称为魔术方法或者是特殊方法。它们是由 Python 自身使用的,用来实现某些内置功能或是操作符重载等功能。例如: - `__init__`: 构造函数,在创建新实例时自动调用。 - `__str__`: 返回对象的字符串表示形式,用于打印输出。 ```python class MyClass: def __init__(self, value): self.value = value def __str__(self): return f"MyClass instance with value={self.value}" my_object = MyClass(42) print(my_object) # 使用 __str__() 方法来显示自定义消息 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值