在Python中,要想使自己寫的代碼規範、模組化,需要把代碼和功能劃分為不同的module檔案,但是對於有些功能來說,劃分為不同的模組會帶來一定的不方便,比如資料庫的訪問,一般一個應用中對同一個資料庫只會建立一個訪問串連,所以需要在多個模組中共用這個連線物件,那麼該如何應用呢?經過這幾天的學習,終於掌握了其使用的方法。對高手來說也許不算什麼,但是對我這個新手來說,算是一個較大的進步了。
#---------------------------------------------------------
A.py
global CONN_DB
CONN_DB = None
def connDB()
..... #建立資料庫連接
#---------------------------------------------------------
B.py
imort A
A.connDB()
print A.CONN_DB
#---------------------------------------------------------
C.py
from A import *
connDB()
print CONN_DB
#---------------------------------------------------------
大家可以實驗一下,B和C的結果是截然不同的
下面我說明一下原因
為什麼結果會不一樣??
在B.py打出的結果中,可以看出CONN_DB已經有值了,但是C.py中仍然是None
在於import A 和 from A import *兩種的引用機制不同
import A 是指使用A中所有的屬性和方法(即變數和函數),在B中使用時,一定要A.屬性 A.方法來調用,這時候調用的是A中原有的內容
而from A import *是對A中所有屬性和方法的引用,也就是A中所有屬性和方法的一個備份,對於方法(即函數)可以正常使用,但是對於屬性(即變數)的使用卻有問題,
也就是說在A中的CONN_DB和C中的CONN_DB並不是同一個變數,只是在C開始的時候,把A的CONN_DB賦值給了CONN_DB,但是由於A中並沒有調用connDB函數初始化CONN_DB,所以從A中複製到C的CONN_DB也是None,而C後面調用的connDB中初始化的卻是A中的CONN_DB,所以C中的CONN_DB始終為None
如果想在C中使用CONN_DB的話,可以在A中這麼寫:
#---------------------------------------------------------
A.py
global CONN_DB
CONN_DB = None
def connDB()
..... #建立資料庫連接
connDB() #調用一下,在別的模組reload本模組時,就已經給CONN_DB賦值了
#---------------------------------------------------------