在 Python 中,对象名称前的单前导和双前导下划线代表什么?
网友回答:
_foo
:只是一个约定。程序员指示变量是私有的一种方法(无论这在 Python 中意味着什么)。__foo
:这具有真正的意义。解释器将此名称替换为 ,以确保该名称不会与另一个类中的类似名称重叠。_classname__foo
__foo__
:只是一个约定。Python 系统使用不会与用户名冲突的名称的一种方式。在 Python 世界中,没有其他形式的下划线有意义。此外,在这些约定中,类、变量、全局等之间没有区别。
网友回答:
在类中,带有前导下划线的名称向其他程序员指示该属性或方法打算在该类中使用。但是,隐私不会以任何方式强制执行。
对模块中的函数使用前导下划线表示不应从其他地方导入该函数。
来自 PEP-8 风格指南:
_single_leading_underscore
:弱“内部使用”指标。例如 不导入名称以下划线开头的对象。from M import *
来自 Python 文档:
表单的任何标识符(至少两个前导下划线,最多一个尾随下划线)都将以文本方式替换为 ,其中是去除了前导下划线的当前类名。这种重整是在不考虑标识符的语法位置的情况下完成的,因此它可用于定义类私有实例和类变量、方法、存储在全局变量中的变量,甚至存储在实例中的变量。在其他类的实例上私有于此类。
__spam
_classname__spam
classname
以及来自同一页面的警告:
名称重整旨在为类提供一种定义“私有”实例变量和方法的简单方法,而不必担心派生类定义的实例变量,也不必担心类外的代码对实例变量进行混乱。请注意,重整规则主要是为了避免事故而设计的;一个坚定的灵魂仍然有可能访问或修改被认为是私有的变量。
>>> class MyClass():
... def __init__(self):
... self.__superprivate = "Hello"
... self._semiprivate = ", world!"
...
>>> mc = MyClass()
>>> print mc.__superprivate
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: myClass instance has no attribute '__superprivate'
>>> print mc._semiprivate
, world!
>>> print mc.__dict__
{'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}
网友回答:
到目前为止,答案很好,但缺少一些花絮。单个前导下划线并不完全是一种约定:如果使用 ,并且模块未定义列表,则从模块导入的名称不包括带有前导下划线的名称。假设这主要是一个惯例,因为这种情况是一个非常模糊的角落;-)。from foobar import *
foobar
__all__
前导下划线约定不仅广泛用于私有名称,还广泛用于C++所谓的受保护名称 – 例如,完全打算被子类覆盖的方法的名称(甚至是那些必须重写的方法,因为在基类中它们!-)通常是单前导下划线名称,用于向使用该类(或子类)实例的代码指示所述方法不打算直接调用。raise NotImplementedError
例如,要使线程安全队列具有与 FIFO 不同的排队规则,可以导入队列、子类 Queue.Queue 并覆盖 and ;“客户端代码”从不调用这些(“钩子”)方法,而是调用(“组织”)公共方法,例如 and(这被称为模板方法设计模式 — 例如,请参阅此处,这是一个有趣的演示文稿,该演示基于我关于该主题的演讲视频,并添加了脚本的概要)。_get
_put
put
get
编辑:会谈描述中的视频链接现已断开。您可以在此处和此处找到前两个视频。
模板简介:该模板名称为【在 Python 中,对象名称前的单前导和双前导下划线代表什么?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Python】栏目查找您需要的精美模板。