1、什么是自定義模塊
在Python中,模塊一共可以分為兩大類:內置系統模塊 和 自定義模塊
模塊的本質:在Python中,模塊的本質就是一個Python的獨立文件(后綴名.py),里面可以包含全局變量、函數以及類。
注:在Python中,每個Python文件都可以作為一個模塊,模塊的名字就是文件的名字。也就是說自定義模塊名必須要符合標識符命名規則。
?
2、定義一個自定義模塊
案例:在Python項目中創建一個自定義文件,如my_module1.py
def sum_num(num1, num2):
? ? return num1 + num2
3、導入自定義模塊
import 模塊名稱
或
from 模塊名稱 import 功能名
案例:
import my_module1
# 調用my_module1模塊中自定義的sum_num方法
print(my_module1.sum_num(10, 20))
4、自定義模塊中功能測試
在我們編寫完自定義模塊以后,最好在模塊中對代碼進行提前測試,以防止有任何異常。
引入一個魔方方法:__name__
,其保存的內存就是一個字符串類型的數據。
隨著運行頁面的不同,其返回結果也是不同的:
① 如果__name__
是在當前頁面運行時,其返回結果為__main__
② 如果__name__
在第三方頁面導入運行時,其返回結果為模塊名稱
基于以上特性,我們可以把__name__
編寫在自定義模塊中,其語法如下:
if __name__ == '__main__':
? ? # 執行測試代碼
__name__
魔術方法除了可以在自定義模塊中測試使用,還可以用于編寫程序的入口:
# 定義一個main方法(入口文件)
def main():
? ? # 執行我們要執行的功能
? ? # ① 打印選擇菜單
? ? # ② 添加學員信息
? ? # ③ 刪除學員信息
? ? # ...
? ??
# 調用執行入口
if __name__ == '__main__':
? ? main()
5、多模塊中功能命名沖突問題
☆ 命名沖突
當我們編寫了多個模塊時,可能在導入到其他頁面時,會產生一個問題:全局變量、函數、類出現重名情況,我們把這個情況就稱之為“命名沖突”。
如導入my_module2和my_module3,里面都封裝了一個func()方法,其在導入以后,my_module3中的func()方法就會覆蓋my_module2中的func()方法。
my_module2.py
def func():
? ? print('my_module2中的func方法')
my_module3.py
def func():
? ? print('my_module3中的func方法')
導入到其他Python文件中,測試效果:
from my_module2 import func
from my_module3 import func
func()
☆ 解決方案
① 把所有模塊的導入方式都寫入文件的最上面,如果發現命名沖突了,馬上和模塊的開發人員進行功能核對
② 給重名的方法進行as重命名
from my_module2 import func as my_module2_func
from my_module3 import func as my_module3_func
6、模塊命名的注意事項
在實際項目開發中,一定要特別注意:我們自定義的模塊名稱一定不能和系統內置的模塊名稱相同,否則會導致代碼無法正常執行。
舉個栗子:定義一個與系統內置模塊同名的模塊
random.py
08-Python中引入與系統模塊同名的自定義模塊.py
import random
print(random.randint(-100, 100))
randint屬于random模塊的內置方法,不可能存在找不到的情況。之所以出現以上問題的主要原因在于:我們的項目中存在了一個與系統模塊同名的模塊文件。所以其在引用random模塊式,其執行順序:
引入某個模塊 => 當前項目中尋找是否有同名的文件 => 如果找到則直接使用,未找到 => 繼續向上尋找 => Python解析器中
如何證明:模塊的引用一定是按照你說的這個順序呢?
答:使用__file__
魔術方法
print(random.__file__)
7、__all__魔術方法
如果一個模塊文件中有__all__
變量,當使用from xxx import *
導入時,只能導入這個列表中的元素。
主要功能:限制使用模塊中的某些功能,也就是說你導入后可以使用的方法只能是__all__
中封裝好的方法。
案例:
my_module.py
__all__ = ['func1']
def func1():
? ? print('func1方法')
def func2():
? ? print('func2方法')
09-Python中限制引用模塊中的方法.py
from my_module import *
func1()
func2() ?# 報錯