【python】和python开发人员用同一套命名系统,一期视频就学会!

【python】和python开发人员用同一套命名系统,一期视频就学会! — 码农高天

码农高天

AI-assisted summary of 【python】和python开发人员用同一套命名系统,一期视频就学会! — original source. Check the original for full context.

Source published:

Key ideas

  • PEP 8 命名规范的核心价值在于建立一致性,让标识符本身携带结构层面的元信息,从而降低代码阅读和协作时的认知开销。 (0:00)
  • Python 官方推荐格式收敛为三种:常量使用全大写下划线、类使用大驼峰、其余所有对象(包括模块、函数与变量)统一使用全小写下划线,彻底排除了小驼峰。 (0:00)
  • 类内部的双下划线强私有并非真正的安全隔离,而是通过 Name Mangling 将变量重命名为 `_类名__变量名`,主要作用是防止子类命名覆盖。 (5:00)
  • 开发者须警惕命名遮蔽风险,严禁将变量命名为 list 或 dict 等内置类型,并避免脚本文件名与标准库模块同名导致循环导入混乱。 (10:00)

Detailed notes

## Background 该视频由 YouTube 频道“码农高天”于 2024 年 3 月 30 日发布。视频旨在解决开发者在编写代码时变量命名风格不统一、平白增加思维负担的问题,系统性地介绍了 Python 官方推荐的命名规范,帮助开发者建立统一一致的命名习惯。

## TL;DR 视频深入阐述了遵循 PEP 8 命名规范的核心理念——通过“一致性”降低阅读与维护时的思维开销。高天系统归纳了 Python 中收敛出的三大核心格式:全大写下划线用于常量、大驼峰用于类定义、全小写下划线统领包括模块、函数和变量在内的其余对象。此外,视频细致解析了单下划线占位符、弱私有前缀以及类内部双下划线触发的 Name Mangling(名称修饰)机制,并警告普通开发者切勿滥用 Dunder 魔术方法,最后提醒大家务必警惕覆盖内置函数及与标准库模块重名的常见陷阱。

## Atmosphere & style 整期视频呈现出资深工程师特有的清晰、严谨与务实风格。高天的讲解直截了当且循循善诱,既能提纲挈领地指出命名背后的系统化逻辑,又擅长用底层机制拆解“防君子不防小人”的技术细节;穿插的教学轶事更增添了亲切感,让原本枯燥的编码规范讲解变得生动透彻、极具启发性。

## Bulletin - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) PEP 8 命名规范的核心价值在于建立一致性,让标识符本身携带结构层面的元信息,从而降低代码阅读和协作时的认知开销。 - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) Python 官方推荐格式收敛为三种:常量使用全大写下划线、类使用大驼峰、其余所有对象(包括模块、函数与变量)统一使用全小写下划线,彻底排除了小驼峰。 - [05:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=300s) 类内部的双下划线强私有并非真正的安全隔离,而是通过 Name Mangling 将变量重命名为 `_类名__变量名`,主要作用是防止子类命名覆盖。 - [10:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=600s) 开发者须警惕命名遮蔽风险,严禁将变量命名为 list 或 dict 等内置类型,并避免脚本文件名与标准库模块同名导致循环导入混乱。

## Key takeaways - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 变量名的好坏取决于内容传递的有效信息量与形式规范,需在表达清晰与长度简练之间取得平衡。 - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 虽然 Python 3 支持广义 Unicode 字符作为变量名,但出于编码兼容性考虑极不推荐使用中文命名。 - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 遵循命名规范的驱动力是一致性(Consistency),规范命名能让读者一眼区分变量、常量、函数与类。 - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 全大写加下划线(SCREAMING_SNAKE_CASE)专门用于声明常量,属于开发者之间“互不修改”的语义约定。 - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 大驼峰命名法(CamelCase / PascalCase)在 PEP 8 中被严格限制仅用于类定义。 - [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 模块、函数、普通变量及方法统一采用全小写加下划线(snake_case),因函数与模块在 Python 中属于可传递的一等公民。 - [05:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=300s) 单独的单下划线 `_` 约定作为占位符使用,明确向代码阅读者传达该变量后续不会被读取的信息。 - [05:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=300s) 前置单下划线代表弱私有,不仅具备接口提示作用,还能在 `from module import *` 时自动屏蔽导出。 - [05:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=300s) 类内的双前置下划线触发解释器的名称修饰(Name Mangling)机制,拼接类名前缀以防止属性被意外覆盖。 - [05:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=300s) 前后双下划线(Dunder)专供 Python 内部魔术方法使用,开发者在自定义普通属性和方法时应严格避免使用。 - [10:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=600s) 严禁使用 `list`、`dict` 等内置类型构造器作为变量名,以防覆盖全局内置函数并引发隐蔽的运行时 Bug。 - [10:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=600s) 本地脚本文件命名切忌与标准库模块同名(例如命名为 turtle.py),否则导入检索会优先命中本地文件导致导入失败。

## Detailed walkthrough ### [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 什么是好的变量名与 PEP 8 命名规范的核心理念

给变量起名字看似是极其基础的内容,但现实中有很多人在命名上仍然无法做到前后一致,平白无故给自己增加了许多思维障碍。在 Python 中,一个合法的变量名必须由字母、下划线和数字组成,且首字符不能是数字。虽然在 Python 3 中字母的定义被扩展成了广义的 Unicode 字符,开发者甚至可以使用中文汉字作为变量名,但通常极不推荐使用中文变量名,因为这常常会因编码问题踩进一些莫名其妙的深坑。合法的规则给予了开发者极大的自由空间,但也带来了新问题:究竟什么才算是一个“好”的变量名?判断好坏通常有两个维度:内容和形式。从内容的角度来看,一句话概括就是这个变量名究竟传递了多少有效信息。例如在 `n`、`name` 和 `username` 三者中,`username` 传递出的有效信息明显最多。不过在实际编写代码时,开发者也必须在信息量与变量名长度之间做出取舍,不能为了塞入更多信息而无休止地拉长名字,这种平衡很大程度上取决于项目本身和工程经验。

从形式上来看,当一个变量名包含多个单词时,如果挤在一起就会难以辨识,而变量名中又严禁包含空格,因此业界演化出了四种典型的书写方式:全小写加下划线(snake_case)、全大写加下划线(SCREAMING_SNAKE_CASE)、大驼峰命名(CamelCase / PascalCase)以及首字母小写的小驼峰命名(mixedCase)。在复杂的底层工程(例如 CPython 源代码)中,甚至会存在 CamelCase 和下划线混用的情况。而官方对于这些形式的推荐用法,详尽地记录在 PEP 8 规范之中。高天指出,遵循这一套命名约定的底层核心驱动力在于“一致性”:“那命名 convention 背后的核心叫做 consistency 也就是一致性,当你拥有一致性的时候,你就会减少一些无谓的思维开销。”这种一致性让变量名本身携带了结构层面的元信息,使阅读者扫一眼名字就能立即判断它是一个普通变量、常量、函数还是类,从而在根本上提升编程效率。

在 Python 的官方开发规范中,常用的命名格式其实只收敛到了三种,完全排除了小驼峰(mixedCase): - **全大写加下划线(SCREAMING_SNAKE_CASE)**:专门用来表示常量。虽然 Python 语言层面并没有真正的不可变常量机制,但大写命名传达的约定是“这个值你别动,我也不会动”;在标准库中看到全大写下划线也可以明确得知其常量身份。 - **大驼峰命名(CamelCase)**:仅在一种场景下使用,那就是类定义(Class definition)。只要看到 CamelCase,就可以立即确信它代表一个类。 - **全小写加下划线(snake_case)**:除去常量和类名之外,其余的所有对象均统一采用小写加下划线命名。

```mermaid flowchart TD accTitle: Python PEP 8 核心命名规则分类 accDescr: 描述 Python 中常量、类与其他所有对象在 PEP 8 中的命名规则分流

Root["Python 标识符命名约定"] --> ConstBranch["常量定义"] Root --> ClassBranch["类定义"] Root --> CommonBranch["其他所有命名"]

ConstBranch --> ConstStyle["全大写加下划线<br/>(SCREAMING_SNAKE_CASE)"] ClassBranch --> ClassStyle["大驼峰命名<br/>(CamelCase)"] CommonBranch --> CommonStyle["全小写加下划线<br/>(snake_case)"]

CommonStyle --> Scope["涵盖范围: module, variable, function, method"] ```

- 包含模块(module)、变量(variable)、函数(function)以及方法(method)在内的所有对象均使用全小写加下划线命名。 - 之所以将模块、函数、普通变量统一归为小写下划线,是因为在 Python 的“一等公民”模型下,函数和模块经常作为变量被传递和引用,具有高度一致的性质。 - 学习统一的命名规范并非单纯为了代码美观,其实质是利用语法约定的自解释性来降低阅读和协作时的认知负荷。

[05:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=300s) 下划线前缀的语义与功能:从弱私有到 Name Mangling

在 Python 命名规范中,下划线——特别是前置下划线(prefix)——扮演着特殊角色,不仅具备语义暗示,还会在特定场景下直接影响解释器的运行行为。首先是单独的一个下划线 `_`,它在 Python 中是一个完全合法的变量名,通常被约定用作“占位符”。当语法结构强制要求定义一个变量但逻辑上完全不需要用到它时(例如在 `for _ in range(10):` 循环中单纯为了打印 10 个随机数),使用单下划线比使用常规的 `for i in range(10):` 能传达更多的确定性信息,直接告诉阅读者“这个循环变量后续不会被使用”。

```mermaid flowchart LR accTitle: Python 下划线前缀与命名修饰行为 accDescr: 展示双下划线在类内部触发 Name Mangling 的机制

subgraph UserView["开发者代码调用"] CallSecret["obj.__secret<br/>(直接访问失败 AttributeError)"] CallMangled["obj._MyClass__secret<br/>(访问成功)"] end

subgraph InternalMangling["Python 解释器内部机制"] OrigVar["定义: __secret"] --> Mangler["Name Mangling 处理"] Mangler --> MangledVar["重命名为: _MyClass__secret"] end

CallMangled -.->|"能够匹配底层真实字段"| MangledVar ```

进一步扩展则是带有前置单下划线的变量名(如 `_variable`),在 Python 中被称为“弱私有”。它在语义上友好地向调用者示意该属性或方法是私有接口(private),提示外部“不要随便动它”。除了语义提示外,单下划线前缀还会影响实际的运行行为:当其他模块使用 `from module import *` 时,解释器会自动忽略所有以单下划线开头的全局变量,尊重其私有设定。然而之所以称其为“弱私有”,是因为这种限制完全依靠自觉,外部若通过显式路径强行调用(如直接调用 `_get_raw()`),程序依然能够毫无阻碍地执行。与弱私有相对的是在类定义内部使用的“强私有”——双前置下划线(如 `__get_raw` 或 `__secret`)。一旦在类中使用了双下划线开头,外部直接通过属性名访问就会抛出异常报错。然而这种保护在底层其实是“防君子不防小人”,因为 Python 解释器在编译类定义时对其执行了名称修饰(Name Mangling)机制:

> “Python 实际上是在 class definition 里面对双下划线开头的变量进行了一个 name mangling,也就是他在里面偷偷的把这个双下划线开头变量给改名了。”

在名称修饰机制下,解释器只是悄悄在变量名前面拼接了一个下划线和当前类名,原本的 `__secret` 在类 `MyClass` 中实际上被改名为 `_MyClass__secret`。只要通过带有修饰后的名称(如 `obj._MyClass__secret`)依然可以绕过限制成功读取数据,因此这一机制主要用于防止子类命名冲突或无意覆盖,切不可将其视作严格的软件安全特权机制。最后,前后均带有双下划线的命名方式(学名为 Dunder,即 Double Underscore)专门用于保留给 Python 内部的“魔术方法”(Magic Methods,如 `__init__`、`__str__` 等)。高天对此给出了极其严厉的建议:对于 Python 普通开发者而言,原则上只有三个字——“不要用”,开发者绝不应该在自己自定义的普通方法或属性上使用这种双下划线包围的格式。

[10:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=600s) 避免命名遮蔽与模块导入冲突

在处理命名时,还有一个极其容易被新手甚至有经验的开发者疏忽的陷阱:命名覆盖内置函数(Built-in Functions)。在日常编码中,经常有人顺手将一个列表变量命名为 `list`,或者把一个字典变量命名为 `dict`。这种行为直接覆盖了内置的类型构造器和全局命名空间内的核心函数,极易在后续调用真实内置能力时引发莫名其妙且隐蔽的运行期 Bug。

除了避免变量名与内置函数重名之外,在给 Python 脚本文件本身命名时,也务必严格规避与内置模块或标准库重名。高天分享了一段早年的教学经历:在教初学者使用 Python 自带的 `turtle` 绘图模块时,学生最常踩的一个坑就是把自己的练习文件随手保存为 `turtle.py`。随后脚本第一行执行 `import turtle` 时,Python 的导入机制会优先检索当前目录下的本地文件,导致脚本陷入“自己导入自己”或者无法找到标准库绘图属性的怪圈,整个模块环境瞬间陷入混乱。因此,开发者在任何时候给变量、函数乃至代码文件起名时,脑海中必须始终时刻紧绷一根弦,主动防范和排查潜在的名字冲突。

## Notable quotes > [00:00](https://www.youtube.com/watch?v=x6I8x-40w6k&t=0s) 命名 convention 背后的核心叫做 consistency 也就是一致性,当你拥有一致性的时候,你就会减少一些无谓的思维开销。 — 高天

## Mentioned Python, Python 3, CPython, PEP 8, Unicode, 高天, turtle

## Video description 最近才发现其实很多人在给自己的变量起名字的时候依然无法做到一致,无谓地增加了一些思维障碍。这期视频我们通过介绍官方推荐的命名方式,来带给大家一个统一一致的命名系统,减轻编程负担。

[Source](https://www.youtube.com/watch?v=x6I8x-40w6k)

中文简报

和Python开发者用同一套命名规范,一期视频快速掌握 本视频深入阐述了遵循 PEP 8 命名规范的核心理念——通过“一致性”降低代码阅读与维护时的思维负担。高天系统梳理了 Python 归纳出的三大核心格式:常量采用全大写下划线、类定义采用大驼峰命名、包括模块、函数及变量在内的其余对象统领采用全小写下划线。此外,视频详细解析了单下划线占位符、弱私有前缀以及类内部双下划线触发的名称修饰(Name Mangling)机制,告诫普通开发者切勿滥用 Dunder 魔术方法,并提醒务必警惕覆盖内置函数及与标准库模块同名的常见陷阱。 PEP 8 命名规范的核心价值在于建立一致性,使标识符本身承载结构层面的元信息,从而降低代码阅读与协作时的认知负担。 (0:00) Python 官方推荐格式收敛为三种:常量使用全大写下划线、类使用大驼峰命名、其余所有对象(包括模块、函数与变量)统一使用全小写下划线,完全排除了小驼峰命名法。 (0:00) 类内部的双下划线强私有并非真正的安全隔离机制,而是通过名称修饰(Name Mangling)将变量重命名为 `_类名__变量名`,主要用于防止子类产生命名覆盖。 (5:00) 开发者须警惕命名遮蔽风险,避免将变量命名为 list 或 dict 等内置类型,并防止脚本文件名与标准库模块同名导致循环导入混乱。 (10:00)

Reading summary

码农高天指出,Python 命名约定的核心在于一致性,开发者遵循 PEP 8 规范能有效传递结构元信息,降低阅读与协作时的认知负荷。 合法性要求与 PEP 8 的三种核心格式 (0:00) 在 Python 中,合法的变量名由字母、下划线和数字组成且首字符不能是数字。虽然 Python 3 支持广义 Unicode 字符乃至中文作为标识符,但因容易引发编码问题而不被推荐。评价一个变量名的好坏取决于内容传递的有效信息量以及形式的可读性,开发者需要在有效信息与长度之间权衡。为了在禁止包含空格的变量中清晰表达多个单词,业界收敛出了不同的书写方案。 根据 PEP 8 规范,Python 官方开发约定基本排除了首字母小写的小驼峰(mixedCase),而收敛为三种主要形式:常量采用全大写加下划线(SCREAMING_SNAKE_CASE),向调用者示意该值不应被修改;类定义唯一定义使用大驼峰命名(CamelCase);其余所有对象——包括模块(module)、变量(variable)、函数(function)和方法(method)——统一采用全小写加下划线(snake_case)。这种统一源于 Python 中函数与模块皆为一等公民的特性,让开发者仅凭字面格式即可推断对象类型。 下划线前缀语义与名称修饰机制 (5:00) 下划线在 Python 命名中具备语义暗示,并在特定场景下直接改变运行期行为。单独的下划线 `_` 常被约定用作占位符,例如在无须使用循环变量的 `for _ in range(10):` 中,明确传达该变量后续不会被调用的确定信息。前置单下划线(如 `_variable`)被称为“弱私有”,用于提示外部该属性为私有接口;当其他模块执行 `from module import *` 时,解释器会自动忽略以单下划线开头的全局变量,但外部依然可以通过显式路径直接调用。 在类内部使用的前置双下划线(如 `__secret`)常被称为“强私有”。外部直接访问该属性会触发报错,但其底层机制为名称修饰(Name Mangling),即解释器在编译类定义时将其重命名为 `_ClassName__secret`。这种设计主要是为了防止子类命名冲突或无意覆盖,外部通过修饰后的全名仍可直接读取,因而并非绝对的安全机制。此外,前后均带双下划线的 Dunder 命名专门保留给内置的魔术方法,高天明确强调普通开发者不应在自定义属性或方法中使用该格式。 防范命名遮蔽与模块导入冲突 (10:00) 开发者在编码时需时刻警惕命名遮蔽。将变量命名为 `list` 或 `dict` 等常用词汇,会直接覆盖全局命名空间内的内置类型构造器与核心函数,后续调用正常内置功能时极易触发隐蔽的运行期错误。 同样的问题也发生在脚本文件的命名上。若将本地脚本命名为与内置库相同的名称(例如随手保存为 `turtle.py`),当代码执行 `import turtle` 时,Python 的导入检索机制会优先加载当前目录文件,导致脚本发生自我导入或缺失标准库模块属性,使整个模块环境陷入混乱。 严格遵循 PEP 8 命名规范并主动规避内置标识符与库名冲突,能够消除无谓的思维开销,确保工程代码在长期维护中兼具清晰度与运行稳定性。

Source quotes

[0:00] 高天: 命名 convention 背后的核心叫做 consistency 也就是一致性,当你拥有一致性的时候,你就会减少一些无谓的思维开销。

Original transcript

[0:00] 这期视频我们来聊一下怎么给变量命名之前呢我认为这是一个非常基础的内容然后大家都会了后来我发现还是有很多人在这个部分有一点迷茫那我就用这一期视频的时间把这件事给彻底的说明白好,那首先,什么是合法的变量名所谓合法的变量名就是python的解释器能认识的变量名那在python中一个合法的变量名是由字母下滑线和数字组成的并且第一个字符不可以是数字当然在python3里面这个字母的定义其实是广义的你可以写一个中文的变量名你可以认为中文的这个字啊也算一种字母但是一般来说我们不推荐使用中文变量名因为有时候可能会由于一些编码的原因踩进一些莫名其妙的坑完全没有必要啊那合法的变量名显然给了我们非常大的操作空间对吧我们可以给变量起各种奇迹怪怪的名字所以接下来的问题就是什么是一个好的变量名我们可以从内容和形式两个角度去判断一个变灵的好坏那从内容的角度一句话概括就是这个变量名传递了多少有效信息比如说左边这三个变量Nname和username明显是username传递出的有效信息更多那当你的变量名包含的有效信息更多的时候它就是一个非常好的变量名当然我们也要在信息量和变量铭的长度上做取舍不能说为了更多的信息我们把这个变量名无限增长那这二者之间的平衡更多的时候是和项目本身有关的也更靠经验那从上一个例子我们知道有的时候我们的一个变量名可能会包含若干个单词当我们把这些单词全都挤着写在一起的时候我们就看不清谁是谁而在变量名中又不能包含空格所以从形式上我们又有四种不同的变量名写法这四种写法我已经列在左边了你可以用小写字母跟下发现大写字母跟消息或者你可以用camelcase 也就是通过首字母大写的方式来区别单词Chamelcus中文叫驼峰命名,它要分为大驼峰跟小驼峰小驼峰有事叫mixed case他们的区别就是第一个字母是不是大写当然在程序比较复杂的时候也会出现CamelCase跟Underscore混用的情况比如在cpython的原代码里就出现了大量的这种使用方式好,那讲到这里其实是老生常谈很多的技术UP主呢都会告诉你这些事而我们的视频肯定是要聊一些其他人聊的比较少的内容所以今天我们的主题是什么是被推荐的变量名也就是所谓的Naming Convention那python的内名convention实际上是在pip8里面有比较详细的描述的如果大家感兴趣的话可以去把这个全文读一下我今天会把这里面最常用的部分拿出来给大家介绍首先为什么我们要naming convention那那名convention背后的核心叫做consistency也就是一致性当你拥有一致性的时候 你就会减少一些无谓的思维开销那从变量名的角度讲就是变量名传递出了更多的信息量比如说当我看到一个变量名的时候 我可以迅速的分辨 它代表的是一个变量还是一个长量或者说它是一个函数还是一个类那只有你拥有了这种一致性你才有能力做出这样的判断所以说学习一个统一的命名方式并不光是为了让自己的程序好看它实际上是可以增加你的编程效率的好,在python代码里面,我们使用到的名字格式只有前面三种小语下销线,大写下销线和Camel Case我们不会用到Mixed Case我们先说最简单的大写下号线在pthom中,大写效卸只用来表示长量当然我们知道在python中没有真正的乘量那常量的意思表达的是这个值啊 你别动 我也不会动所以当你要表示一个常量的时候,用大写下导线同时在python的标准库里当你看到大写下入线的时候你也可以知道这个东西是个程量CAMO case也只有在一个情况下会被使用到类的定义上所有的class definition的名字都是Camel Case这当然也就意味着当你看到开谋case的时候 你就可以知道 [5:00] 这是一个class而不是其他乱七八糟的东西好除了我们上面提到的常量和类名之外剩下的所有的名字都是小写下要线这里面包括了module, variable, function, method,他们这些东西的名字都是小写下小写其中一个很重要的原因就是这些东西在python里面经常都会被看成一个变量他们会被使用会被传来传去甚至还有很多共同的性质所以他们的命名方式也是一致的好,那这些是我们聊到的python的基础命名习惯那在python里关于命名还有一个部分是需要聊的就是有关下滑线确切的说是前置下发线 也就是所谓的prefix在python中呢 前置下发现 无论是在语意上还是在功能上都有可能对这个变量本身造成一定的影响我们首先来讲这个单下滑线 就是一个下滑线 什么都没有它也是python里面的一个合法的辩量名那这个变量名一般来说被当作站位服务就是这块在语法上它应该有一个变量但是这个变量呢我用不上比如我们左边的程序我们想打印10个随机数我们用for什么in range10就可以重复10次但是循环变量我们并不使用它在这里我们就用一个单下化线来拿到这个循环面量那相比于很多人更习惯使用的这个Foreign range词大家可以看到使用下滑线表达出了更多的信息量就是明确的告诉看这段代码的人这个变量我是没有用的接下来我们要讲的就是一个前置下滑线也就是在变量门人最前面有一个下落线的情况这种呢我们在python里面叫弱私有就是他在语义上尝试表达的是private这个性质也就是友好的告诉其他人这个东西你不要用它并不是一个给你开放的接口这也是通过下滑线表达出额外的信息那实际上单下滑线对程序运行是有影响的我们假设你一个module里面有很多的global variable当你在做from这个module import新的时候它是不会import单下滑线开头的gobovariable的也就是在这个过程中他尊重了这个单下滑线开头变量的语义他没有把这个所谓私有变量给import进来当然了 这个支持点比较偏 大家不用记住你只需要知道单下滑线开头表示的语义是一个弱私有为什么叫弱私有呢就是如果你强行使用它你还是使用得了的大家看我们左边的例子虽然我告诉你了get raw这个东西是私有的东西你不要用但是你要强行动的话没有一点问题这是一个善意的提醒那与弱私有相对应的肯定就是强私有对不对在python的class definition里面,注意是class definition里用两个下滑线开头表示强死有你是没有办法在这个class之外来访问这个强死有的内容的比如说我们把刚才那个get raw再加一个下滑线让它变成一个强死有方法左边的这些代码就没有办法运行了它就会报错那对于member variable也是一样的当你用双下方线开头的时候它就没有办法直接access到这个变量但是大家注意一下啊python这个部分的实现叫做防君子不防小人Python实际上是在class definition里面对双下滑线开头的变量进行了一个name mongering也就是他在里面偷偷的把这个双下融线开头变量给改名了我们看我们如果打印的是O.下发线my class双下发线secret就成功的打印出来这个secret了因为在python name-mangolin的过程中他把这个双下滑线secret的前面增加了一个下滑线class名那这个机制呢更多的是防止你误用啊它不是一个真正的编程意义上的保护机制所以不要把它当一个安全feature用啊那说完两个下滑线 就是四个下滑线前后各有两个下方线它的学名叫做Denderscore应该是double underscore的意思吧这个名字中文语境的人应该很少用这个名字是专门表示python中的魔术方法 也就是magic method对于python的使用者来说就是三个字不要用你自己定义的method永远不要用到这个形式 [10:00] 最后呢再说一点有可能会被大家忽略的就是我们千万不要在命名的时候覆盖了built in functions比如说给一个list的请问叫list给一个Dictionary请名叫Dict对吧不要和内置函数起一样的名字这样有可能会产生一些莫名其妙的bug那说到这儿呢还有另外一件事想听大家就是大家在给自己的文件起名的时候也不要跟内置的module重名我当年在教py当turtle的时候遇到的最多的一个bug就是学生把自己的文件名起名叫turtle.py然后一引破了turtle 然后所有东西都乱套了所以说起名的时候脑子里要想着名字冲突这件事好 那这期视频就到这里 希望大家有所帮助 喜欢的话记得点下关注 别忘了一键三连哦字幕志愿者 杨茜茜