1. 程式人生 > >python模塊和包

python模塊和包

dll 重命名 測試 形式 port 函數名 引用 名稱空間 判斷

模塊

1 每個py文件就是一個模塊
2 自我感覺就是一個或多個py文件被當做模塊導入到另一個文件,在另一個文件中引用py文件中的某些功能

為什麽要用模塊

1 為了寫的代碼可以重用,不至於把所有的代碼卸載一個文件內,當項目規模小的時候,一個py文件就可以搞定,
2 但是如果是一個非常大的項目,就必須把相關功能進行分離,方便我們日常維護和新項目的開發

import加載的模塊一共分成四個通用類別:

1 .使用python編寫的PY文件
2 .已被編譯為共享庫或者DLL或者C或者C++的擴展
3 .4 .使用C編寫並連接到python解釋器的內置模塊

導入模塊的方式:
1.import 模塊名


2.from 模塊名 import 函數名(方法名)

import方式導入

 1 自定義一個模塊module.py
 2 print(這裏是py文件module的開始)
 3 name = bob
 4 address = 上海
 5 
 6 def play():
 7     print(f{name}去了{address}迪士尼)
 8 
 9 print(這裏是py文件module的結束)
10 
11 
12 在另外一個文件test3中引用這個模塊
13 #此時我們已經導入了一個自定義模塊module並重命名這個模塊為modu(as的功能為重命名模塊名)
14 #但這裏pycharm報錯,並不是python報錯,因為pycharm找不到這個模塊
15 #導入模塊的時候,會把模塊中的代碼執行了一遍
16 import module as modu 17 def func(): 18 print(hello world) 19 20 print(modu.name) 21 print(modu.address) 22 23 func() #自己這個文件中的方法 24 modu.play() #模塊中的方法 25 結果 26 這裏是py文件module的開始 27 這裏是py文件module的結束 28 bob 29 上海 30 hello world 31 bob去了上海迪士尼 32 33 註意: 由於模塊在導入的時候會創建其自己的名稱空間,所以在使用模塊中的變量的時候一般是不會產生沖突的

一個文件中多次導入同一個自定義模塊

1 import module
2 print(hhhhhhh)
3 import module   #如果已經導入過該模塊,此時不會再執行模塊中的代碼了
4 import module
5 import module
6 結果
7 這裏是py文件module的開始
8 這裏是py文件module的結束
9 hhhhhhh

導入模塊的過程:
1. 去判斷當前正在導入的模塊是否已經倒入過
2. 如果已經導入過,不會重新導入該模塊
3. 如果沒有導入過,首先開辟一個內存空間
4. 把該模塊中的代碼放在新開辟的空間中,運行該模塊中的代碼
5. 把該文件的名字作為當前名稱空間的名字(前提是沒有as)

查看已經導入的模塊

1 import sys
2 print(sys.modules.keys())
3 4 print(globals())    #查看模塊的名稱空間

模塊導入順序:
1. 先導入內置模塊
2. 第三方模塊
3. 自定義的模塊

 1 事例1
 2 import module as modu
 3 print(modu.name)       #應用的是模塊中的name變量
 4 
 5 modu.name = 攻城獅   #從另一個模塊中改變應用的模塊中變量的值
 6 modu.play()            #所以模塊中的name變量值改變為修改後的‘攻城獅‘
 7 print(modu.name)
 8 結果
 9 這裏是py文件module的開始
10 這裏是py文件module的結束
11 bob
12 攻城獅去了上海迪士尼
13 攻城獅
14 
15 
16 事例2
17 import module as modu
18 print(modu.name)    #打印的是模塊中的name變量
19 
20 def func():
21     global name     #此時在文件中開辟了一個name變量的內存空間
22     name = 佩奇   #把全局變量name內存空間賦值為‘佩奇‘
23     modu.play()     #打印模塊中的play方法
24 func()
25 modu.play()         #文件中gloal的全局變量name並不影響模塊中name變量的值
26 print(name)         #這裏打印的是此文件中全局name變量(並不是模塊中的變量)
27 結果
28 這裏是py文件module的開始
29 這裏是py文件module的結束
30 bob
31 bob去了上海迪士尼
32 bob去了上海迪士尼
33 佩奇
34 
35 
36 事例3
37 vim module.py
38 print(這裏是py文件module的開始)
39 name = bob
40 address = 上海
41 
42 def play():
43     global  name        #global 引用當前模塊的全局
44     name = 貝塔       #模塊中全局變量修改為‘貝塔‘
45     print(f{name}去了{address}迪士尼)
46 
47 print(這裏是py文件module的結束)
48 
49 import module as modu
50 name = 佩奇
51 
52 modu.play()
53 print(modu.name)   #返回的是模塊中修改後的name變量值
54 
55 print(name)     #並沒有改變文件內的name變量值
56 結果
57 這裏是py文件module的開始
58 這裏是py文件module的結束
59 貝塔去了上海迪士尼
60 貝塔
61 佩奇
62 
63 
64 也可以用import一次性導入多個模塊(不建議這樣用)
65 import module as modu,test2,time,os,...
66 modu.func()
67 test2.mode()
68 結果
69 我是模塊1
70 我是模塊2

模塊測試: 要運行這個py的時候才執行代碼
如果在模塊中定義__name__ == __main__,作用就是測試模塊中的某些功能
所以別的文件調用不了此模塊中的方法,但單獨執行這個模塊可以執行這個模塊中的方法

1 name = bob
2 address = 上海
3 def play():
4     print(f{name}去了{address}迪士尼)
5 
6 if __name__ == __main__:      # 當前文件如果是啟動文件就執行
7     print(這裏是py文件module的開始)
8     play()
9     print(這裏是py文件module的結束)

from方式導入模塊: 導入的只有一個功能

 1 vim module.py
 2 def func1():
 3     print(我是模塊中的方法一)
 4 
 5 def func2():
 6     print(我是模塊中的方法二)
 7 
 8 vim test.py
 9 from module import func1
10 func1()
11 結果
12 我是模塊中的方法一
13 
14 
15 from module import func1
16 func1 = 定義的變量與導入的模塊中的方法重名則會覆蓋模塊中的方法
17 print(func1)
18 結果
19 定義的變量與導入的模塊中的方法重名則會覆蓋模塊中的方法

總結
如果當前文件中出現了重名的變量時,會覆蓋掉模塊引入的那個變量
所以創建的py文件的名字不要和系統內置的模塊重名

包的定義:

1 包實際就是文件夾,包內可以寫很多個模塊
2 註意,在python2中規定,包內必須存在__init__.py文件,創建包的目的不是為了運行,
3 而是被導入使用,包只是一種形式而已,包的本質就是一種模塊
4 自我理解
5 1.只要是文件夾就是包,
6 2.文件夾裏邊的py文件就是模塊,
7 3.文件(模塊)中的方法就是包中某個模塊的方法
8 4.調用,包名.模塊名.模塊中的方法名(函數)

按照代碼從小到大的順序排列:

1 一個表達式 -> 一條語句  -> 語句塊  -> 函數 -> 類  -> 模塊  -> 包  -> 項目

__init__.py文件說明

1 在__init__.py文件中分別去引用所在目錄(子包)中的內容
2 作用其實就是在文件中導入子包(此目錄的下一級目錄)或者模塊名

導入包方法

1 import 包名.模塊名.方法
2 from 包名 import 模塊名
3 調用 模塊.方法

包導入分類

1 絕對導入: 從頂級包開始導入的
2 相對導入: 用.或..作為起始位置的(在包內部可以使用)
3 from ..包名 import 模塊名
4 
5 程序對包或模塊的查找路徑是:sys.path,跟著你的啟動文件所在的位置變化
6 無論使用絕對導入,還是相對導入,啟動文件一定要放在最外面
7 註意
8 在pytho中不允許運行的程序導包的時候超過當前頂級包的範圍(相對導入),如果使用絕對導入,沒有這個問題
9 在導包出錯的時候,一定要先導入sys模塊,先看sys.path,看一下是否真的能獲取到包的信息

python模塊和包