我與python約個會:20. 企業級開發基礎1:自定義模塊

本節內容

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
# !這不是我們想要的,私有的不是不能讓其他模塊訪問嗎?
# !這裏請注意:下劃線開頭的變量,規範是私有變量,不應該
# 讓其他的模塊訪問,而不是強制,這裏的規範是一種項目開發約定!
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章