Python文件的执行顺序是怎样的

Table of Contents

Python 文件的执行顺序是逐行解释执行的,但具体的流程会因代码结构(如函数、类、模块导入等)有所不同。

1. 模块级别的代码执行

Python 解释器从文件的第一行开始,按顺序执行所有不在函数、类或条件块中的代码(称为“模块级代码”)。例如:

# 模块级代码:直接执行
print("1. 这是模块级别的代码,最先执行")

def my_function():
    print("3. 这是函数内的代码,调用时才会执行")

class MyClass:
    print("2. 这是类定义中的代码,类加载时执行")

    def __init__(self):
        print("4. 这是类实例化时执行的代码")

# 模块级代码:继续执行
print("2. 继续执行模块级代码")

输出顺序

1. 这是模块级别的代码,最先执行
2. 这是类定义中的代码,类加载时执行
3. 继续执行模块级代码

2. 函数和类的定义

  • 函数定义(def
    解释器会记录函数的名称和代码体,但不会执行函数内的代码。只有在函数被调用时,才会执行函数内部的代码。
  • 类定义(class
    解释器会执行类定义内的模块级代码(如类属性的赋值、print语句等),但不会执行类方法中的代码(如 __init__method 等)。

示例

print("1. 模块级代码")

def func():
    print("3. 函数被调用时执行")

class MyClass:
    print("2. 类定义中的模块级代码")  # 直接执行
    def __init__(self):
        print("4. 类实例化时执行")

func()          # 调用函数
obj = MyClass() # 实例化类

输出顺序

4. 模块级代码
5. 类定义中的模块级代码
6. 函数被调用时执行
7. 类实例化时执行

3. 模块导入(import

当导入其他模块时,被导入模块的模块级代码会立即执行。例如:

# 文件 `module_a.py`
print("模块A的模块级代码被执行")

def func_a():
    print("模块A的函数被调用")
# 文件 `main.py`
print("1. main模块的代码开始执行")
import module_a  # 导入时会执行module_a的模块级代码

print("2. main模块的代码继续执行")
module_a.func_a()  # 调用module_a中的函数

输出顺序

8. main模块的代码开始执行
模块A的模块级代码被执行
1. main模块的代码继续执行
模块A的函数被调用

4. if __name__ == "__main__"

  • 当 Python 文件作为主程序直接运行时,__name__ 的值为 "__main__",此时会执行该条件块中的代码。
  • 当文件被作为模块导入时,__name__ 的值为模块名,条件块中的代码不会执行。

示例

print("1. 模块级代码总是执行")

if __name__ == "__main__":
    print("2. 仅当文件直接运行时执行")

直接运行时的输出

2. 模块级代码总是执行
3. 仅当文件直接运行时执行

作为模块导入时的输出

4. 模块级代码总是执行

5. 执行顺序的完整流程

  1. 解析文件:解释器读取并解析整个文件。
  2. 执行模块级代码:按顺序执行所有不在函数、类或条件块中的代码。
  3. 处理定义:记录函数和类的定义(类定义中的模块级代码会立即执行)。
  4. 执行 if __name__ == "__main__"(如果文件是主程序)。
  5. 调用函数或实例化类:按代码逻辑触发函数或类的执行。

通过理解这些规则,可以更好地控制代码的执行顺序,避免因逻辑错误导致的问题。

明天聊聊赚钱这件事