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

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