当前位置: 首页 > 面试题库 >

前后带有下划线的python属性有什么区别

方谦
2023-03-14
问题内容

我想知道这些在Python中有什么区别?

self._var1
self._var1_
self.__var1
self.__var1__

问题答案:

首先,您可能会从PEP 8-Python代码样式指南中找到此报价很有帮助:

此外,还可以识别出以下使用前划线或后划线的特殊形式(通常可以将它们与任何大小写惯例结合使用):

_single_leading_underscore:“内部使用”指示器较弱。例如from M import *,不导入名称以下划线开头的对象。

single_trailing_underscore_:按惯例用于避免与Python关键字冲突,例如
Tkinter.Toplevel(master, class_='ClassName')

__double_leading_underscore:在命名类属性时,调用名称修饰(在类FooBar内部,__boo变为_FooBar__boo;见下文)。

__double_leading_and_trailing_underscore__:位于用户控制的名称空间中的“魔术”对象或属性。例如__init__
__import____file__。请勿发明此类名称;仅按记录使用它们。

不过,您是在类属性的上下文中询问的,因此让我们看一下您的特定示例:

在类self._var1中给属性命名会向该类的用户指示该属性只能由类的内部(或子类的内部)访问,并且他们不必直接访问它,并且可能不应修改它。您应该在Java或C#中使用privateprotected字段的相同位置使用前划线,但要注意,该语言实际上并没有强制不可访问性-
相反,您相信类的用户不会做任何愚蠢的事情,然后离开如果他们真的非常确定他们知道自己在做什么,那么他们可以选择访问(或修改)您班级的私有字段。

单个前导和尾部下划线

self._var1_这不是我见过的东西。我认为这种命名方式在Python世界中没有任何常规含义。

双领先下划线

这实际上具有语法意义。参照self.__var1从类调用的范围内名字粉碎。从您的班级外部,该变量似乎位于self._YourClassName__var1而不是self.__var1。并非每个人都使用此功能-
我们根本不在我工作的地方-对于简单的课程,使用单个下划线就显得有些荒谬和令人讨厌。

但是,存在理由。如果您使用大量继承,如果仅使用单个前导下划线,则您将无法指示某人阅读您的代码,使“私有”变量与“受保护”变量之间的区别-
甚至不意味着子类可以访问,子类可以访问但外部世界不能访问。因此,在这种情况下,使用单个尾随下划线表示“受保护”,使用双下划线表示“私有”可能是一个有用的约定(名称改写将允许子类在其子类中使用具有相同名称的变量,而不会引起碰撞)。

前后双下划线

self.__var1__正如我从字面上所写的那样,这是您永远都不应创建的东西,因为前导和尾随双下划线的命名方式只能用于具有Python定义的特殊含义的名称,例如类的__init____eq__方法。您可以随意重写它们来更改类的行为(实际上,几乎所有类都将由程序员定义__init__),但是您不应像这样的样式来编写自己的名称self.__var1__



 类似资料:
  • 我发现 _A 是可以访问的但是 __B 是无法访问的会报错:Unexpect System Error:'A' object has no attribute .... 不是说下划线只是约定而已么,怎么其实还是有实际作用的

  • 问题内容: 对于“属性”和“属性”之间的区别,我通常感到困惑,并且找不到很好的资源来简洁地详细说明这些区别。 问题答案: 属性是一种特殊的属性。基本上,当Python遇到以下代码时: 它查找中,然后检查,看它是否有一个,或方法- 如果这样做,这是一个性质。如果它 是 一个属性,则不仅会返回该对象(就像对其他任何属性一样),还会调用该方法(因为我们一直在进行查找),并返回该方法返回的内容。 有关Py

  • 本文向大家介绍lodash和下划线之间有什么区别?,包括了lodash和下划线之间有什么区别?的使用技巧和注意事项,需要的朋友参考一下 lodash和underscore都是实用程序库,它们通过提供使数组,数字,对象,字符串等的使用更加容易的实用程序,使JavaScript变得更容易。这些库非常适合- 迭代数组,对象和字符串 操作和测试值 创建复合函数 它们都是功能库。Lo-Dash是Unders

  • 问题内容: 在jQuery 1.6.1中进行更改之后,我一直在尝试定义HTML中属性和属性之间的差异。 查看jQuery1.6.1发行说明中的列表(在底部附近),似乎可以对HTML属性和属性进行如下分类: 属性:所有具有布尔值或UA计算得出的值,例如selectedIndex。 属性:可以添加到既不是布尔也不包含UA生成值的HTML元素中的“属性”。 有什么想法吗? 问题答案: 在编写HTML源代

  • 问题内容: 在jQuery 1.6.1中进行更改之后,我一直在尝试定义HTML中属性和属性之间的差异。 查看jQuery1.6.1发行说明中的列表(在底部附近),似乎可以对HTML属性和属性进行如下分类: 属性:所有具有布尔值或UA计算得出的值,例如selectedIndex。 属性:可以添加到既不是布尔也不包含UA生成值的HTML元素中的“属性”。 有什么想法吗? 问题答案: 在编写HTML源代

  • 问题内容: 通过身份验证表单中的一些Django代码,我注意到以下语法 通常,我只会在字符串周围使用一对引号。有人可以替我解释一下“用户名”下划线和括号是做什么的吗? 问题答案: 的是一个可调用(函数的名称,可调用对象)。通常用于该函数,例如在Django中: 正如文档所说: Python的标准库gettext模块作为的别名安装到全局名称空间中。在Django中,出于以下两个原因,我们选择不遵循此