首页 > 解决方案 > 名称以下划线开头的变量/方法是内部的还是受保护的?

问题描述

考虑以下代码段:

class MyClass:
    def __init__(self, i):
        self._i = i

    def _print(self):
        print(self._i)


my_obj = MyClass(5)

print(my_obj._i)
my_obj._print()

是否被视为受保护变量或内部变量MyClass._iMyClass._print

根据官方 Python 文档,类§私有变量

大多数 Python 代码都遵循一个约定:前缀为下划线的名称(例如 _spam)应被视为 API 的非公共部分(无论是函数、方法还是数据成员)。它应被视为实施细节,如有更改,恕不另行通知。

因此,我理解这些文档的方式,在名称前加下划线表示“内部”:旨在由它定义的包使用,而不是在此包之外。因此,上面的片段是正确的。

但是:如果我打开上面的代码段,PyCharm 会发出警告:

Access to a protected member _i of a class

Access to a protected member _print of a class

为什么要“保护”?

我错过了什么吗?是否有一个我不知道的约定要求我采取额外的步骤来区分受保护的和内部的?

标签: pythonnaming-conventions

解决方案


你在问题中说:

因此,我理解这些文档的方式是,在名称前加下划线表示“内部”:旨在由定义它的包使用,而不是在此包之外。

通常,类的“内部”或“受保护”属性或方法仅供该类使用,甚至不能在整个包/模块中的类之外使用。

模块属性和功能:是的,它们仅用于模块内部。

这就是您收到警告的原因;该约定比您想象的还要严格。


无论“受保护”或“内部”变量和方法只是一种约定,该脚本都将起作用。


推荐阅读