18

在 Python 中,有单前导下划线、双前导下划线、双前导 + 双尾下划线和单尾下划线的约定。其中许多在对象名称前的单下划线和双下划线的含义是什么中的答案中进行了概述?.

但是单前导+单尾下划线的含义或约定是什么?我第一次看到它们在enum模块中的使用:

8.13.15.3.2。支持的_sunder_名称

  • _name_– 成员姓名
  • _value_– 成员的价值;可以在new中设置/修改
  • _missing_– 未找到值时使用的查找函数;可能会被覆盖
  • _ignore_– 名称列表,作为 list() 或 str(),不会转换为成员,并将从最终类中删除
  • _order_– 在 Python 2/3 代码中使用以确保成员顺序一致(类属性,在类创建期间删除)
  • _generate_next_value_– 由 Functional API 和 auto 用于获取枚举成员的适当值;可能会被覆盖

我以前从未见过这样的单前导单尾下划线拆分名称。它们是否以任何特殊方式处理,或者以其他方式具有与任何其他与下划线相关的命名约定不同的隐含含义?它们与根本没有下划线有什么不同?

4

1 回答 1

8

他们没有以任何特殊方式对待。它们被 enum 模块使用,以便

  • 不会被意外覆盖

例如

class Status(Enum):
    alive = auto()
    dead = auto()
    missing = auto()

你可以看到,Status.missing并且Status._missing_是不同的对象。如果 Enum 方法_missing_被命名为missing,我们将覆盖它。

  • 不显示为私人。_valuepython 中的名称被认为是私有的。为了表示这些不是私有的(同样,用户可能希望枚举值是私有的),而是给它们命名

  • 如上所述,其他替代方法,例如__double_leading_underscore和在 python 中也有特殊含义。方法的行为类似于纯 python 的协议,但不被语言保留。__dunder___sunder_Enum__dunder__

基本上,这是一种避免属性名称冲突而不给人错误印象的选项。

于 2018-08-24T14:32:15.347 回答