先决条件: Python中的下划线 在Python中,不存在除对象内部之外无法访问的“私有”实例变量。然而,大多数Python代码和编码人员都遵循一种惯例,即以下划线作为前缀的名称,例如。 _极客 应该被视为API或任何Python代码的非公共部分,无论是函数、方法还是数据成员。在讨论这一点的同时,我们还将试图理解各种形式的拖尾的概念 强调 例如,对于范围(10)内的uu,对于初始的uu(self)。
破损及其工作原理
在Python中,有一种称为名称混乱的东西,这意味着对类私有成员的有效用例的支持有限,基本上是为了避免名称与子类定义的名称之间的名称冲突。格式为_geek的任何标识符(至少两个前导下划线或最多一个尾随下划线)将替换为_classname _geek,其中classname是当前类名,去掉前导下划线。只要它发生在类的定义范围内,这种破坏就完成了。这有助于让子类重写方法,而不破坏类内方法调用。 让我们看看这个例子,试着找出下划线是如何工作的:
python
# Python code to illustrate how mangling works class Map : def __init__( self , iterate): self . list = [] self .__geek(iterate) def geek( self , iterate): for item in iterate: self . list .append(item) # private copy of original geek() method __geek = geek class MapSubclass( Map ): # provides new signature for geek() but # does not break __init__() def geek( self , key, value): for i in zip (keys, value): self . list .append(i) |
损坏规则的设计主要是为了避免事故,但仍然可以访问或修改被认为是私有的变量。这甚至可以在特殊情况下使用,例如在调试器中。
_单前导下划线
所以基本上,在方法、函数或数据成员的开头加一条下划线意味着你不应该访问这个方法,因为它不是API的一部分。让我们看看这段代码:
python
# Python code to illustrate # how single underscore works def _get_errors( self ): if self ._errors is None : self .full_clean() return self ._errors errors = property (_get_errors) |
该片段取自Django源代码(Django/forms/forms.py)。这表明错误是属性,它也是API的一部分,但方法_get_errors是“私有的”,因此不应该访问它。
__双前导下划线
一开始,两个下划线会引起很多混乱。这是关于语法而不是惯例。双下划线将损坏类的属性名称,以避免类之间的属性名称冲突。例如:
python
# Python code to illustrate how double # underscore at the beginning works class Geek: def _single_method( self ): pass def __double_method( self ): # for mangling pass class Pyth(Geek): def __double_method( self ): # for mangling pass |
__双前导双尾随下划线__
还有另一种情况是双前导和尾随下划线。我们在使用特殊变量或方法(称为“魔法方法”)时遵循这一点,如_len _;,_init _;。这些方法为名称提供了特殊的语法特征。例如,_file__;表示Python文件的位置,当执行a==b表达式时,执行_eq__;。
例子:
python
# Python code to illustrate double leading and # double trailing underscore works class Geek: # '__init__' for initializing, this is a # special method def __init__( self , ab): self .ab = ab # custom special method. try not to use it def __custom__( self ): pass |
本文由 金莫伦卡 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 我已经提到了Python文档,hackernoon。com和igorsobreira。通用域名格式 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。