您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python模块初始化顺序?

Python模块初始化顺序?

在C 中,存在 一个众所周知的问题,称为全局/静态变量初始化顺序失败,原因是C 无法确定哪个全局/静态变量将首先在编译单元中初始化,

我认为该声明突出了Python和C 间的关键区别:在Python中,没有诸如不同的编译单元之类的东西。我的意思是,在C (如您所知)中,两个不同的源文件可能完全彼此独立地进行编译,因此,如果您比较文件A中的一行和文件B中的一行,就没什么好说的了您将被放置在程序的第一位。这有点像具有多个线程的情况:您无法说出线程1中的特定语句是在线程2中的特定语句之前还是之后执行。您可以说C ++程序是并行编译的。

相反,在Python中,执行从一个文件的顶部开始,并以明确定义的顺序在文件中的每个语句中进行,然后在导入它们的位置分支到其他文件。实际上,您几乎可以将import指令视为#include,并可以通过这种方式确定程序中所有源文件中所有代码行的执行顺序。(好吧,这要复杂得多,因为模块只有在第一次导入时才真正执行,并且由于其他原因。)如果C ++程序是并行编译的,则Python程序将被串行解释。

您的问题还涉及Python中模块的更深层含义。python模块-包含在单个.py文件中的所有内容- 是实际对象。单个源文件中在“全局”范围内声明的所有内容实际上都是该模块对象的属性。Python中没有真正的全局范围。(Python程序员经常说“全局”,实际上global在该语言中有一个关键字,但它实际上始终是指当前模块的顶层。)我可以看到,要习惯于使用一个奇怪的概念从C 背景开始。来自Java的使我适应了一些习惯, 在这方面,Java与Python相比,与C 更加相似。(Java中也没有全局范围)

我将提到在Python中使用变量是完全正常的,而不知道是否已初始化/定义变量。好吧,也许不正常,但在适当情况下至少可以接受。在Python中,尝试使用未定义的变量会引发NameError; 您不会像在C或C ++中那样获得任意行为,因此您可以轻松地处理这种情况。您可能会看到以下模式:

try:
    duck.quack()
except NameError:
    pass

如果duck不存在,则不执行任何操作。其实,您通常会看到的是

try:
    duck.quack()
except AttributeError:
    pass

如果duck没有名为的方法,则不执行任何操作quack。(这AttributeError是您尝试访问对象的属性时遇到的错误,但是该对象没有该名称的任何属性。)这就是通过Python中的类型检查所通过的:我们认为如果需要的话鸭子要做的是嘎嘎,我们可以要求鸭子嘎嘎,如果是,我们不在乎它是否真的 是鸭子。(这被称为鸭子打字;-)

python 2022/1/1 18:26:49 有187人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶