我正在阅读一些基本上看起来像这样的代码:
class Foo(object):
class_name = __module__.replace('_', '-')
对我而言,这看起来很奇怪(__module__
,那是什么?)所以我去看了蟒蛇data-model。快速搜索显示__module__
是类对象和函数对象的属性。但是,全局命名空间中没有__module__
可用(只需尝试查看并观察结果的NameError
即可轻松验证。)
我决定将其用于实现特定的行为,但作为最后的检查,我决定使用其他实现进行测试。事实证明,此代码使用 1
执行我的问题是这种行为是否实际上是在语言参考中的任何地方定义的。我不确定我为什么要这样做,但我可以安全地依赖__module__
在类创建命名空间中,还是所有实现者都决定以同样的方式执行此操作?
1 所有linux,但我怀疑这很重要......
答案 0 :(得分:8)
文档的定义是类具有__module__
属性。 CPython这样做的方式似乎是它在类块的开头定义了一个局部变量__module__
。然后,这个变量就像在那里定义的任何其他变量一样成为一个类。
我找不到任何文档说必须以这种方式定义__module__
。特别是,我找不到任何明确说明属性必须在类体中定义为局部变量的文档,而不是在类创建的后期阶段将其指定为类属性。 This answer对另一个问题提到它以这种方式工作,并显示它在字节码中的显示方式。他们通过使其与CPython一样工作来修复a Jython bug。
我猜这是一个CPython实现细节,已经转移到其他实现。据我所知,文档实际上并没有说__module__
必须在类体内可用,之后只能在类对象上使用。