-5

我知道,当一个模块或者即使模块中的特定对象被导入时——from foo import bar首先评估整个模块。但我只是好奇,如果我们在该模块内部定义一个__init__或一个__new__,它会像在中那样具有特殊含义或处理吗?为什么会这样?

4

3 回答 3

2

松散地说,模块没有方法。

更严格地说,每个模块通常是某个类的一个实例builtins.module(尽管您可以用导入钩子或猴子补丁替换它),并且该类当然有方法。但是模块的全局函数不是模块对象的方法。

你可以很容易地通过打印出来来验证这一点type(foo.func)。它是一个函数,而不是foo实例的绑定方法。

最重要的是,即使模块全局函数实例方法,也不会有任何区别,因为__init__字典中检查,而不是在实例字典中检查。如果您考虑一下,则不可能是其他情况,因为在返回之前您没有检查的实例字典__init__。因此,只有当每个模块都是类对象(和 的实例)时,这才可能起作用type,而它们显然不是。


你的困惑__init__.py是一个红鲱鱼。文件不是函数,更不是方法,文件和模块都不能被调用。


如果您想要严格的定义:这里定义了类和模块。如您所见,该__new__方法是特定于类的功能。它的行为在这里定义。请注意,__init__它实际上是作为 的结果调用的object.__new__,因此在技术上它甚至没有为类定义——但它肯定没有为其他任何东西定义。

同时,在这里__init__.py定义。(请注意,从 Python 3.2 开始,这只是默认导入器对常规包使用的约定,实际上并不是语言本身的一部分。)

除了命名和一些模糊的相似之处外,这两个功能没有任何共同之处。也许命名是一个错误,但我认为更多的人从命名中获得有用的直觉,而不是感到困惑。(无论如何,由于它回到了niPython 1.3 的模块,我怀疑它会很快改变。)

于 2013-05-28T21:25:01.480 回答
2

不,有一个模块类,模块是这个类的实例,但它是 Python 内部的。在模块中定义魔术方法不会将它们添加到模块类中,并且它们在导入时不会做任何特殊的事情。

于 2013-05-28T21:12:52.737 回答
0

我认为您可以通过执行类似于我对无关问题的回答中所做的操作来创建具有__init__()和/或方法模块的类,我可以防止在 Python 中修改对象吗?__new__()

于 2013-05-28T22:16:45.277 回答