顺序执行

Posted xiaohei001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺序执行相关的知识,希望对你有一定的参考价值。

顺序执行

虽然我们有各种流程判断、循环、跳转、控制、中断等等,但从根本上程序还是逐行顺序执行的。

Python代码在执行过程中,遵循下面的基本原则:

  • 普通语句,直接执行;
  • 碰到函数,将函数体载入内存,并不直接执行
  • 碰到类,执行类内部的普通语句,但是类的方法只载入,不执行
  • 碰到if、for等控制语句,按相应控制流程执行
  • 碰到@,break,continue等,按规定语法执行
  • 碰到函数、方法调用等,转而执行函数内部代码,执行完毕继续执行原有顺序代码

if __name__ == "__main__":

很多时候,我们经常在python程序中看到这么一行语句,这里简要解释一下:

首先,__name__ 是所有模块都会有的一个内置属性,一个模块的 __name__ 值取决于你如何调用模块。假如你有一个 test.py文件,如果在 a.py 文件中使用import导入这个模块 import test.py, 那么 test.py 模块的__name__属性的值就是test,不带路径或者文件扩展名。但是很多时候,模块或者说脚本会像一个标准的程序样直接运行,也就是类似 python test.py 这种方式,在这种情况下,__name__ 的值将是一个特别缺省值"__main__"。

根据上面的特性,可以用 if __name == "__main__" 来判断是否是在直接运行该py文件!如果是,那么if代码块下的语句就会被执行,如果不是,就不执行。该方法常用于对模块进行测试和调试,区分直接运行和被导入两种情况的不同执行方式!

我们通过下面的例子,脚本名为test.py,执行python test.py 看看实际的顺序执行方式:

import os          # 1

print(<[1]> time module start)        # 2


class ClassOne():
    print(<[2]> ClassOne body)            # 3

    def __init__(self):                     # 10
        print(<[3]> ClassOne.__init__)

    def __del__(self):
        print(<[4]> ClassOne.__del__)     # 101

    def method_x(self):                     # 12
        print(<[5]> ClassOne.method_x)

    class ClassTwo(object):
        print(<[6]> ClassTwo body)        # 4


class ClassThree():
    print(<[7]> ClassThree body)          # 5

    def method_y(self):                     # 16
        print(<[8]> ClassThree.method_y)  


class ClassFour(ClassThree):
    print(<[9]> ClassFour body)           # 6


def func():
    print("<func> function func")

if __name__ == __main__:                      # 7
    print(<[11]> ClassOne tests, 30 * .)    # 8
    one = ClassOne()                            # 9
    one.method_x()                              # 11
    print(<[12]> ClassThree tests, 30 * .)  # 13
    three = ClassThree()                        # 14
    three.method_y()                            # 15
    print(<[13]> ClassFour tests, 30 * .)  # 17
    four = ClassFour()
    four.method_y()

print(<[14]> evaltime module end)             # 100
  • 首先执行#1的import语句
  • 执行#2的打印语句
  • ClassOne、ClassThree和ClassFour的类定义执行过程中,分别打印#3、#4、#5、#6四句话,但是其中的方法并不执行,仅仅是载入内存
  • 碰到#7的if __name__ == "__main__": 判断为True,于是执行if内部的代码
  • 执行#8的print语句
  • 执行#9,实例化一个ClassOne的对象
  • 执行#10的初始化方法,打印一条语句
  • 返回执行#11的menthod_x调用
  • 返回类的定义体,找到#12,执行方法,打印语句
  • 再返回#13处,打印
  • 执行#14的实例化
  • ClassThree没有自定义初始化方法,接着执行#15
  • 回到类里找到#16的方法,执行打印语句
  • 执行#17
  • ......后面不再详述
  • 执行完最后的#100的打印语句后,按理说程序应该终止退出了,但由于ClassOne这个类定义了__del__方法,还要在最后执行它内部的代码#101这条打印语句。

通过这个例子,相信你对Python的程序执行流程能够有一定的了解。其实这个过程,也是我们读别人代码的过程。

以上是关于顺序执行的主要内容,如果未能解决你的问题,请参考以下文章

scrapy按顺序启动多个爬虫代码片段(python3)

html 将以编程方式附加外部脚本文件的javascript代码片段,并按顺序排列。用于响应式网站,其中ma

NodeJs异步的执行过程

是否可以动态编译和执行 C# 代码片段?

C++ 代码片段执行

执行代码时有时不显示对话框片段