请考虑以下代码段:
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._i
和MyClass._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
为什么要“受保护”?
我想念什么吗?是否存在我不知道的约定,需要我采取额外的步骤来区分受保护的和内部的?
答案 0 :(得分:0)
您在问题中说:
所以,按照我对这些文档的理解,在名称前加下划线的意思是“内部”:打算由定义在该包中而不是在该包外部的包使用。
通常,一个类的“内部”或“受保护”属性或方法仅由该类使用,即,甚至不能在整个包/模块的类外部使用。
模块属性和功能:是的,这些属性和功能只能在模块内部使用。
这就是为什么您收到警告;约定甚至比您想像的还要严格。
无论“受保护的”或“内部”的变量和方法仅是约定俗成的,脚本都可以工作。