__init __,__ new__等在模块中定义

时间:2013-05-28 21:04:02

标签: python

我知道当模块或者即使 模块中的特定对象被导入 - from foo import bar时 - 首先评估整个模块。但我只是好奇,如果我们在该模块中定义__init____new__,它会有一个特殊的意义或处理,就像它在和< EM>包?为什么会这样呢?

3 个答案:

答案 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>

相关问题