python导入包以及Python程序执行顺序理解

http://codingpy.com/article/python-import-101/
https://segmentfault.com/a/1190000009842139

(一)Python模块前面from…import…的初始化方式
刘江的博客:
http://www.liujiangblog.com/course/python/26

实际场景:
main.py初始化EasyLog与svc.py初始化EasyLog:
from biz.t14.t14_auto_svc import T14AutoSvc ###先执行这个(会到
T14AutoSvc类脚本里面,将from及class外层定义的全局变量
EasyLog()
初始化;)

from common.helper.log_helper import EasyLog
from conf.config import Config
if name == ‘main’:
#sftp连接到正式
Config.instance().set_all_io_release()
EasyLog().set_t14_log_config() ###改变了全局变量的属性值;;;
t14_auto_svc = T14AutoSvc() #在已有的全局变量基础上,进行操作;
t14_auto_svc.send_data()

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

Python代码在执行过程中,遵循下面的基本原则(可参考计算机系统相关知识理解):

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

内置模块if name=='main
在一个py程序中,经常会看到if name==‘main’;其中__name__本身是一个内置模块,py文件通常有两大类执行方式,要么是直接运行,比如直接在IDE窗口中点run或者Python 目标.py;要么是被调用运行;在直接运行的时候,该程序的内置属性__name__的值就会是__main__;但py文件作为被调用的对象的时候,该值就不为__main__;

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的程序执行流程能够有一定的了解。其实这个过程,也是我们读别人代码的过程。

总结:
对于一个Python程序,首先执行的是import程序,特别地,如果import了别的包,那么会跳入到别的包模块进行初始化过程(上述的判断__name__之前的那一部分);初始化通常包含:import的语句执行。还有类的定义执行,非__init__()部分,类的方法不真正执行,只是会载入内存;但当真正初始化一个类实例之后,才会执行def init():
参考:http://www.liujiangblog.com/course/python/26

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章