本節內容
1 模塊的概念和意義
2 模塊的定義和使用
3 再說變量的作用域
之前的課程中,我們已經瞭解了python程序設計開發的基礎部分內容
包含了數據類型、變量、運算符、程序選擇結構、循環結構、函數處理、字符串處理等等內容。
本節內容開始,我們開始學習python企業級開發基礎部分的內容,會涉及到模塊式整合開發、面向對象程序設計、錯誤的調試和測試、高級開發[文件IO處理,網絡編程,多線程程序開發、正則表達式等等]內容,
1. 模塊的概念和意義
我們在常規程序開發的過程中,如果只是通過python來寫一些項目維護的小腳本程序,前面學過的內容已經基本夠用了,但是如果涉及到企業級開發的複雜的一些需求的話,程序設計開發過程中會出現大量的代碼,如果着大量的代碼(如:1萬行代碼)寫在一個python文件中,就會讓這個文件的體積非常的龐大,開發過程中會造成大量的不必要的問題:如變量定義是否會覆蓋其他定義的變量,添加功能處理代碼會否影響其他的功能,由於大量代碼集中在一個文件中導致修改維護變得非常的不容易,代碼的可讀性非常 差等等各種問題。
此時,爲了方便我們將不同的處理功能區分開,我們將處理不同數據或者功能的函數分別分組存放在不同的python文件中,就會將上面一個比較龐大的python文件拆分成多個python文件,每個python文件中的代碼內容會比較少,通過多個Python文件互相組合的方式來完成複雜的處理功能。這樣拆分的不同的python文件,每個python文件就是一個單獨的python模塊,專業術語:module
我們定義好的Python模塊,可以在需要的地方,通過import 模塊名稱
關鍵字來引入這個模塊,代碼如下:
user.py 用戶模塊
--------------
def showInfo(name, age):
print("user info: name[" + name + "] age [" + age + "]")
--------------
goods.py 商品模塊
--------------
def showGoods(name, price):
print("goods info: goodsName: [" + name + "] price [¥" + str(price)+ "]")
--------------
main.py 主模塊中使用其他的模塊
--------------
import user
import goods
user.showInfo("tom", 18)
goods.showGoods("alienware", 14999)
拆分模塊的好處是第一、將一個比較複雜的單文件拆分成多個文件,方便代碼的管理和開發維護,第二、我們開發並完善好的Python模塊,在其他需要這個模塊功能的地方就可以直接引入組合這個模塊,不需要重複編寫Python代碼了,第三、不同的python模塊中,就可以使用相同名稱的變量了,不同模塊中的變量不會互相覆蓋數據或者產生衝突,降低了我們代碼開發的成本
2. 模塊的使用和解決的問題
拆分模塊之後,我們會遇到這樣的問題
2.1. 變量名稱衝突
變量名稱在不同的python文件/模塊中,同名變量不會互相產生衝突
user.py 用戶模塊 -------------- # 記錄當前系統中用戶數量的變量count count = 12 # 打印當前系統中用戶數量的函數 def getCount(): print("user count:" + str(count)) -------------- goods.py 商品模塊 -------------- # 記錄當前系統中商品數量的變量count count = 1001 # 獲取並答應當前系統中所有商品數量的函數 def getCount(): print("goods count:" + str(count)) -------------- main.py 主模塊中使用其他的模塊 -------------- import user import goods user.getCount() #執行結果:12 goods.getCount() # 執行結果:1001
2.2. 模塊名稱衝突
我們也同樣考慮到了,模塊名稱和定義變量一樣,某些情況下模塊名稱也有可能衝突,如:我們的項目中處理用戶數據定義了一個工具模塊utils.py,處理商品數據定義了一個工具模塊utils.py,此時這兩個模塊衝突了;解決方案如下
我們會將不同的模塊,python定義了包的概念,根據處理的功能或者數據的不同,存放在不同的包中,用於區分不同的模塊;
包在python中,就是一個文件夾,爲了區分包文件夾和普通的文件夾,在包文件夾中,必須定義一個__init__.py模塊文件,這個文件內容可以爲空。
# 1. 創建users文件夾,是用來處理用戶數據的包 # 2. 在users文件夾下創建__init__.py文件,內容可以爲空 # 3. 在users文件夾下創建utils.py工具模塊 -------------- "這是處理用戶數據的工具模塊" x = 129.00 y = 432.24 # 獲取用戶當前位置的函數 def getLocation(): # 返回用戶位置數據 return x, y -------------- #4. 創建goods文件夾,是用來處理用戶數據的包 #5. 在goods文件夾下創建__init__.py文件,內容可以爲空 #6. 在goods文件夾下創建utils.py工具模塊 -------------- "這是處理商品數據的工具模塊" address = "河南鄭州" # 獲取商品產地的函數 def getProduction(): # 返回商品的產地 return address -------------- 7.創建main.py程序運行的入口文件,引入users和goods兩個模塊 使用不同模塊中的函數 -------------- import users.utils import goods.utils xx, yy = users.utils.getLocation() addr = goods.utils.getProduction() print(xx, yy) print(addr)
3. 模塊中再說變量
變量在之前的課程中,我們已經提到了變量在Python中有局部變量和全局變量的區分,是通過是否定義在函數內部來區分的。
此時有了多模塊之後,對於變量的作用域,需要進行更加細緻的劃分。
3.1. 模塊內部
模塊內部,還是按照正常的情況進行劃分,按照是否定義在函數內部來區分全局變量和局部變量,在模塊文件內部,變量的使用沒有任何的變量
在模塊內部,變量依舊是全局變量/局部變量,變量的作用域正常使用即可
"這是一個用戶數據處理模塊"
# 全局變量,記錄系統中用戶的在線人數
onlineCount = 100
def getUserinfo(name):
# 定義了一個局部變量,這個局部變量只能在當前函數內部訪問
msg = "尊敬的用戶您好,"
if name == "":
name = "遊客"
return msg + name;
3.2. 不同模塊之間的變量訪問
python中定義了模塊之後,不同模塊之間訪問數據和函數的情況就比較常見了;模塊中的變量,有些是需要讓別的模塊訪問的,有些是不希望別的模塊訪問的,此時就會將變量區分爲模塊公開的變量、模塊私有的變量兩種變量了。
-
python的模塊中,按照正常的命名規則命名的變量或者函數,規範爲公開的變量或者函數,其他的模塊都可以正常的訪問
-
python的模塊中,使用一個下劃線開頭來命名的變量或者函數,規範爲私有的變量或者函數,只能在當前模塊中使用
-
python的模塊中,使用兩個下劃線開頭的變量,可以別模塊直接引用使用具有特殊的含義,如__name__表示當前模塊名稱等等;規範要求我們自己的變量名稱儘量不要使用這樣的名稱。
"商品信息管理模塊goods.py"
# 遊客打折折扣,變量名稱下劃線開頭,不希望其他模塊訪問
_discountVisitor = 9.5
# 會員打折折扣,變量名稱下劃線開頭,不希望其他模塊訪問
_discountMember = 8.5
# 遊客購買折扣計算,函數名稱下劃線開頭,不希望其他模塊訪問
def _visitorBuy(goodsName, price):
resPrice = price * _discountVisitor;
print("尊敬的遊客,您購買了" + name + ",總價格是:" + str(resPrice));
# 會員購買折扣計算,函數名稱下劃線開頭,不希望其他模塊訪問
def _memberBuy(goodsName, price):
resPrice = price * _discountMember;
print("尊敬的遊客,您購買了" + name + ",總價格是:" + str(resPrice));
# 購買商品的函數,允許其他模塊訪問的函數,正常命名
def buy(type, name, price):
if type == 1:
_visitorBuy(name, price)
elif type == 2:
_memberBuy(name, price);
else:
print("對不起,您沒有權限購買商品")
注意:這裏出現了公開/公有變量和私有變量/函數的概念,公開/公有變量/函數就是我們平時定義的普通的全局變量/函數;這裏的私有變量/函數,是在原有的全局變量/函數的基礎上,變量名稱前面加了一個下劃線,約定這是私有的變量/函數,不應該讓其他的模塊訪問【記住:這裏的約定,不是強制,所以其他模塊如果要訪問這樣的私有變量,還是可以訪問到的,但是規範上不應該這麼做】
"用戶信息處理模塊users.py" # 這裏定義了一個私有的變量 _userType和_userDesc _userType = "管理員" _userDesc = "遊客操作權限,只能訪問不能修改任何信息" def _changeDisc(_userType): if _userType == "管理員": _userDesc = "超級管理員操作權限" if _userType == "會員": _userDesc = "普通操作權限,不能修改敏感信息" ------------------------- "程序運行的主要模塊main.py" import users # 使用users模塊中的_userType變量 print(users._userType) users._userType = "會員" print(users._userType) # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * # 上面的代碼中,我們可以在main模塊中,訪問引入的 # 另一個模塊users模塊中定義的私有變量_userType # !這不是我們想要的,私有的不是不能讓其他模塊訪問嗎? # !這裏請注意:下劃線開頭的變量,規範是私有變量,不應該 # 讓其他的模塊訪問,而不是強制,這裏的規範是一種項目開發約定! # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *