我知道当模块或者即使 模块中的特定对象被导入 - from foo import bar
时 - 首先评估整个模块。但我只是好奇,如果我们在该模块中定义__init__
或__new__
,它会有一个特殊的意义或处理,就像它在类和< EM>包?为什么会这样呢?
答案 0 :(得分:2)
没有。有一个模块类,模块是这个类的实例,但它是Python的内部。在模块中定义魔术方法不会将它们添加到模块类中,并且在导入时它们不会做任何特殊操作。
答案 1 :(得分:2)
放松一下,模块没有方法。
更严格来说,每个模块都是某个类的实例,通常为builtins.module
(尽管您可以使用导入钩子或monkeypatching替换它),并且该类当然有方法。但模块的全局函数不是模块对象的方法。
只需打印type(foo.func)
即可轻松验证。它是一个函数,而不是foo
实例的绑定方法。
最重要的是,即使模块全局函数是实例方法,也没有任何区别,因为在类中检查了__init__
字典,而不是实例字典。如果你考虑一下,那就没有办法了,因为你不会拥有一个实例字典来检查,直到__init__
返回。因此,只有当每个模块都是一个类对象(以及type
的实例)时,这才有可能起作用,而这些对象显然不是。
你对__init__.py
的困惑是一个红色的鲱鱼。文件不是函数,更不用说方法,也不能调用文件和模块。
如果您需要严格的定义:定义类和模块here。如您所见,__new__
方法是特定于类的功能。其行为定义为here。请注意,__init__
实际上是object.__new__
的结果,因此它甚至没有在技术上为类定义 - 但它肯定没有为其他任何内容定义。
同时,__init__.py
定义为here。 (请注意,从Python 3.2开始,这只是普通包的默认导入程序使用的约定,实际上并不是语言本身的一部分。)
除了命名和一些模糊的相似之外,这两个特征没有任何共同之处。也许命名是一个错误,但我认为更多人从命名中获得有用的直觉而不是混淆。 (无论如何,因为它回到Python 1.3的ni
模块,我怀疑它会很快改变。)
答案 2 :(得分:0)
我认为您可以通过执行类似于我对无关问题的回答Can I prevent modifying an object in Python? <的操作,创建一个具有__init__()
和/或__new__()
方法模块的类。 / p>