是否保证在创建类时定义“__module__”?

时间:2015-06-30 21:24:13

标签: python python-internals

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

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

对我而言,这看起来很奇怪(__module__,那是什么?)所以我去看了蟒蛇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,但我怀疑这很重要......

1 个答案:

答案 0 :(得分:8)

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

我找不到任何文档说必须以这种方式定义__module__。特别是,我找不到任何明确说明属性必须在类体中定义为局部变量的文档,而不是在类创建的后期阶段将其指定为类属性。 This answer对另一个问题提到它以这种方式工作,并显示它在字节码中的显示方式。他们通过使其与CPython一样工作来修复a Jython bug

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