Python 双下划线用法用于类属性

1 投票
1 回答
639 浏览
提问于 2025-04-18 01:59

关于类属性的命名规则,PEP 8中提到:

__双下划线开头和结尾__:这是一些“魔法”对象或属性,它们存在于用户控制的命名空间中。比如说 __init__、__import__ 或 __file__。不要随便创造这样的名字;只在文档中提到的情况下使用它们。

这是否意味着我们永远不应该使用这种命名规则,或者只在“用户控制的命名空间”中使用?

我看到在一些不直接包含在Python中的其他库中也使用过这种命名方式。从我了解的情况来看,使用这种命名规则更像是为了实现一个API。

举几个例子,比如在Pyramid框架中给一个类提供一个__acl__,或者在SQLAlchemy中给一个类添加__tablename__

在API的上下文中使用这种命名规则可以吗,还是说它只应该用于Python本身?

1 个回答

2

Pyramid和SQLAlchemy这两个库没有遵循不随便起名字的规则。

我不太明白你说的“在API的上下文中使用这个约定”是什么意思,但一旦他们起了名字,你就只能按照他们的文档来使用这个名字了。

你自己起名字和在用户控制的命名空间中起名字其实没有什么区别。因为你是Python的用户,任何你可以放名字的地方都是用户控制的。如果你在修改Python的源代码,想给语言添加一个新的扩展,并且需要一个“魔法”名字,那么你可以自己起一个。我想如果你真的这样做,通常会和Python的创始人GvR有某种联系,这样你可以直接问他意见 :-)

这里发生的事情是,库的作者希望有一个名字,用户不会不小心用它来表示其他意思。Python语言也希望名字不会被用户误用,所以它会“保留”某种格式的名字供语言使用。但库的作者决定“偷”一个这些保留的名字,觉得这样可以避免和用户之间的冲突。他们有成千上万的用户,大多数用户他们并不了解。但只有一个Python语言规范,他们可以访问这个规范。所以如果发生冲突,库的开发者会知道,这是一件好事,但这也是他们的责任,解决起来会很麻烦,这就是坏处。

也许他们希望通过使用这个名字,实际上是为自己保留了这个名字,并且GvR会选择不再使用一个已经被流行库使用的名字。或者他们可能在相关的邮件列表上讨论过,并获得了对通常规则的例外——我不知道是否有这样的流程。

撰写回答