字数:1653,阅读量:277

Python 中的下划线

测试环境:

Ubuntu 20.04 x86_64

Python 3.9.10

单下划线前缀: _var

约定的意义是:以单下划线开头的变量或方法仅供内部使用(私有)。但并不是 Python 强制规定的,语法上不会报错。

"""单下划线前缀.py

Copyright (C) 2022 IYATT-yx iyatt@iyatt.com
每个人都可以复制和分发本许可证文档的逐字副本,但不允许更改。
这个程序是自由软件:你可以在自由软件基金会发布的GNU Affro通用公共许可证的条款下重新分发它和/或修改它,
或者许可证的第3版,或者(在你的选择)任何其他版本。
本程序的发布目的是希望它有用,但不提供任何担保;甚至没有对适销性或特定用途适用性的默示保证。
有关更多详细信息,请参阅GNU Affero通用公共许可证。
您应该已经收到GNU Affero通用公共许可证的副本以及本程序。如果没有,请参阅<https://www.gnu.org/licenses/>.
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.
"""


class Test(object):
    def __init__(self):
        self.a = 1
        self._b = 2


if __name__ == '__main__':
    test = Test()
    
    print(test.a)
    print(test._b)

    test.a = 3
    test._b = 4

    print(test.a)
    print(test._b)

当创建了一个模块,在的名称,并且导入模块时使用 from 模块名 import * ,则不会导入单下划线前缀的方法或变量,除非定义了 __all__ 列表。

单下划线后缀:var_

Python 中有部分名称已经被占用了,比如 class、def等,那么一般约定使用单下划线后缀避免命名冲突。

双下划线前缀

直接的理解就是私有化方法和属性,会强制语法检查,但是不建议用作私有的表达。本身主要作用是在多个类中防止属性名相同而冲突(下2图)。

子类继承父类,子类中没有父类中的 __c 属性,但是有一个 _ExtendTest__c,这样就能防止 __c 被子类修改。

前后双下划线:__var__

这个是 Python 保留的名称,用于特殊用途,比如 __init__、__str__、__del__、__call__等。自己编写程序也可以这样命名,但是不建议,可能你现在写的项目中创造了一个,但是不排除未来 Python 本身也出现了一个一样的名字,结果可能会造成冲突。

单下划线:_

保存最后一个执行的表达式的值

以及有时候需要循环,但是并不在意元素值,用作填充迭代

发表评论