gpt4 book ai didi

python - "__module__"是否保证在类创建期间定义?

转载 作者:太空狗 更新时间:2023-10-29 17:48:58 24 4
gpt4 key购买 nike

我正在阅读一些基本上看起来像这样的代码:

class Foo(object):
class_name = __module__.replace('_', '-')

对我来说,那看起来真的很奇怪(__module__,那是什么?)所以我去看了 python data-model .快速搜索显示 __module__ 是类对象和函数对象的属性。但是,在全局命名空间中没有可用的 __module__(只需尝试查看它并观察导致的 NameError 即可轻松验证...)。

我决定将此归因于特定于实现的行为,但作为最后的检查,我决定使用手边的其他实现进行测试。原来这段代码是用1

执行的
  • Cpython 2.7.6
  • Cpython 3.4.0
  • jython 2.5.3
  • PyPy 2.2.1(Python 2.7.3)

我的问题是这种行为是否真的在语言引用中的任何地方定义过。我不确定我为什么要这样做,但我可以安全地依赖 __module__ 在类创建命名空间中,还是所有的实现者都决定以同样的方式这样做?

1所有 linux,但我怀疑这是否重要...

最佳答案

文档确实定义了类将具有 __module__ 属性。 CPython 这样做的方式似乎是它在类 block 的开头定义了一个局部变量 __module__ 。这个变量然后变成一个类属性,就像在那里定义的任何其他变量一样。

我找不到任何说明 __module__ 必须以这种方式定义的文档。特别是,我找不到任何文档明确说明该属性必须在类主体中定义为局部变量,而不是在类创建的稍后阶段被分配为类属性。 This answer to a different question 提到它以这种方式工作,并显示它如何出现在字节码中。有 a Jython bug他们通过使其与 CPython 一样工作来修复。

我猜这是一个 CPython 实现细节,它被转移到其他实现中。据我所知,文档实际上并没有说 __module__ 必须在类体内可用,只能在之后的类对象上使用。

关于python - "__module__"是否保证在类创建期间定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31148770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com