名称以下划线开头的变量/方法是内部的还是受保护的?

时间:2019-02-18 18:27:45

标签: python naming-conventions

请考虑以下代码段:

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官方文档Classes § Private Variables

  

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

因此,据我所知,这些文档的名称前带有下划线的意思是“内部”:打算由定义在该包中而不是在该包外部的包使用。因此,以上代码段是正确的。

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

Access to a protected member _i of a class

Access to a protected member _print of a class

为什么要“受保护”?

我想念什么吗?是否存在我不知道的约定,需要我采取额外的步骤来区分受保护的和内部的?

1 个答案:

答案 0 :(得分:0)

您在问题中说:

  

所以,按照我对这些文档的理解,在名称前加下划线的意思是“内部”:打算由定义在该包中而不是在该包外部的包使用。

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

模块属性和功能:是的,这些属性和功能只能在模块内部使用。

这就是为什么您收到警告;约定甚至比您想像的还要严格。


无论“受保护的”或“内部”的变量和方法仅是约定俗成的,脚本都可以工作。