python - 名称以下划线开头的变量/方法是内部的还是受保护的?
问题描述
考虑以下代码段:
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 文档,类§私有变量:
大多数 Python 代码都遵循一个约定:前缀为下划线的名称(例如 _spam)应被视为 API 的非公共部分(无论是函数、方法还是数据成员)。它应被视为实施细节,如有更改,恕不另行通知。
因此,我理解这些文档的方式,在名称前加下划线表示“内部”:旨在由它定义的包使用,而不是在此包之外。因此,上面的片段是正确的。
但是:如果我打开上面的代码段,PyCharm 会发出警告:
Access to a protected member _i of a class Access to a protected member _print of a class
为什么要“保护”?
我错过了什么吗?是否有一个我不知道的约定要求我采取额外的步骤来区分受保护的和内部的?
解决方案
你在问题中说:
因此,我理解这些文档的方式是,在名称前加下划线表示“内部”:旨在由定义它的包使用,而不是在此包之外。
通常,类的“内部”或“受保护”属性或方法仅供该类使用,甚至不能在整个包/模块中的类之外使用。
模块属性和功能:是的,它们仅用于模块内部。
这就是您收到警告的原因;该约定比您想象的还要严格。
无论“受保护”或“内部”变量和方法只是一种约定,该脚本都将起作用。
推荐阅读
- amazon-web-services - 有没有办法从 CloudFormation 中删除其跟踪?
- caffeine - 咖啡因 - 如何为每个实体设置自己的“过期时间”
- r - 中立的李克特情节搁置一旁
- java - 为什么在这种情况下 CMS 垃圾收集器的 CPU 利用率低于吞吐量垃圾收集器
- reactjs - react-data-grid 无法读取未定义的属性“长度”
- javascript - Facebook登录windw.fb或window.gapi页面刷新后未定义
- python - 按索引添加数据帧,如果索引不存在则删除
- c# - 在 C# 中将扩展名为 txt 的文件更改为 json
- unit-testing - 带有 Mock、Spy 的 Spring AOP。AspectJProxyFactory 无法添加Aspect Mock 实例
- javascript - 传单未捕获类型错误:map.addLayer 不是函数