当前位置: 首页 > 知识库问答 >
问题:

python - Python 类属性 下划线的意义是什么?

蓟雪峰
2023-10-30

我发现 _A 是可以访问的但是 __B 是无法访问的会报错:Unexpect System Error:'A' object has no attribute ....

class A:    @property    def _A(self):    @property    def __B(self): 

不是说下划线只是约定而已么,怎么其实还是有实际作用的

共有3个答案

卫烨烁
2023-10-30

private variables

“Private” instance variables that cannot be accessed except from inside an object don’t exist in Python. However, there is a convention that is followed by most Python code: a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.

Since there is a valid use-case for class-private members (namely to avoid name clashes of names with names defined by subclasses), there is limited support for such a mechanism, called name mangling. Any identifier of the form __spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam, where classname is the current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, as long as it occurs within the definition of a class.

双下划线确实有“实际作用”。它会触发 name mangling ,实际存在的成员名字会被增加一个修饰。它在类外无法直接被使用,从而是“私有的”。


在类外使用修饰后的名字是可以访问的。

崔博延
2023-10-30

双下划线比单下划线多了 Name Mangling,这是个 Python 2.0 时引入的新特性。你可以直接理解成编译器会把属性名替换成别的。

但如果你知道编译器是怎样替换的(一般来说是 _类__属性,具体到题目中的例子就是 _A__B),你照样可以在外部访问到它。换而言之,它依然还是“公有”的,只是被编译器改了名字。

因此我们说 Python 并没有真正的属性可见性修饰符,下划线仅仅是约定俗成。

燕靖
2023-10-30

在Python中,以单下划线_A开头的类属性被视为是保护属性,即该属性不应该被直接访问,而应该通过类的其他方法进行访问。因此,你可以在类内部访问_A属性,但不能从类的外部直接访问。

另一方面,以双下划线__B开头的类属性被视为是私有的类属性。这意味着该属性只能在类内部访问,无论是通过实例还是类本身。尝试从类的外部直接访问__B属性将会引发错误。

这两种约定是用于提供一定的代码可读性和保护。使用下划线前缀可以明确表明属性的访问级别,从而帮助其他开发人员更好地理解代码并避免意外的错误。

在你的代码示例中,__B属性是私有的,因此无法从类的外部直接访问。如果你尝试这样做,将会收到类似于'A' object has no attribute '__B'的错误消息。

总结起来,单下划线_A表示保护属性,可以在类内部访问但不应直接从外部访问;双下划线__B表示私有属性,只能在类内部访问。这些约定是用于提高代码的可读性和保护性。

 类似资料:
  • 问题内容: 可以解释一下在Python中使用对象名称前加下划线的含义吗?另外,说明单首和双首下划线之间的区别。无论所讨论的对象是变量,函数,方法等,该含义是否保持不变? 问题答案: 单下划线 类中带有下划线的名称仅是为了向其他程序员表明该属性或方法旨在私有。但是,名称本身并没有做任何特别的事情。 引用PEP-8: :“内部使用”指标较弱。例如,不导入名称以下划线开头的对象。 双下划线(名称改写)

  • 本文向大家介绍python中单下划线和双下划线分别是什么?相关面试题,主要包含被问及python中单下划线和双下划线分别是什么?时的应答技巧和注意事项,需要的朋友参考一下 name:一种约定,python内部的名字,是用来与用户自动以的名字区分开,防止冲突

  • 问题内容: 我想知道这些在Python中有什么区别? 问题答案: 首先,您可能会从PEP 8-Python代码样式指南中找到此报价很有帮助: 此外,还可以识别出以下使用前划线或后划线的特殊形式(通常可以将它们与任何大小写惯例结合使用): :“内部使用”指示器较弱。例如,不导入名称以下划线开头的对象。 :按惯例用于避免与Python关键字冲突,例如 :在命名类属性时,调用名称修饰(在类FooBar内

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

  • 问题内容: 我在阅读“ JPA 2.0中的动态类型安全查询”一 文,偶然发现了以下示例: 我想知道,这里的下划线到底是什么意思? 由于下划线是类名的有效部分,所以我不明白为什么可以在JPA中使用它。我用代码中的现有实体检查了这个,当然我的班级无法解析为 问题答案: 那就是持久性的元模型。这是您可以在Java中键入安全JPA查询的方法。它允许查询静态地检查您的查询,因为类描述了您的JPA 。在HQL

  • 阅读了下文档,我如果只是想增加项目的灵活度多人分目录开发,这样用不到蓝图的 url 绑定和视图绑定,那蓝图是不是就失去了意义