1. 程式人生 > >Python入門學習筆記————16(模組,包,名稱空間)

Python入門學習筆記————16(模組,包,名稱空間)

模組

  • 一個模組就是一個包含Python程式碼的檔案,字尾名為.py。
  • 模組
    • 程式太大,編寫維護非常不方便,需要拆分
    • 模組可以增加模組的複用
    • 當做名稱空間使用,避免命名衝突
  • 模組的定義
    • 模組就是普通檔案,任何程式碼都可以直接寫
    • 根據模組的規範,最好在模組中編寫以下內容
      • 函式(單一功能)
      • 類(相似功能的組合,或者類似的業務模組)
      • 測試程式碼
  • 如何使用模組
    • 直接匯入
    • 語法
        import module_name
        module_name.function_name
        module_name.class_name
      
    • import 模組 as 別名 (之後匯入時只需要使用別名即可)
    • from module_name import func_name,class_name (不將整個模組匯入,用到模組哪些函式等匯入哪些)
      • 按上述有選擇性匯入
      • 在使用時可以直接使用匯入內容,不需要字首
    • import module_name import *
      • 匯入模組所有內容
    • 'if name == "main" '的使用
      • 可以有效地模組程式碼被匯入時被動執行問題
      • 建議所有程式的如口都以此程式碼為入口

In [7]:

 

#下列程式碼假設儲存檔名為p01.py
#一個人學生類
class Student():
    def __init__(self,name='Noname',age=18):
        self.name = name 
        self.age = age 
    def say(self):
        print('My name is {0},I am {1}'.forrmat(self.name,self.age))
def sayHello():
    print('Welcome to Wuzhi !')
 
print('我是模組')
我是模組

In [13]:

 

#當模組引用時
'''
import p01  #檔名
stu = p01.Student('goudan',18)
stu.say()
p01.sayHello()
'''
#上述模組引用程式碼與下述程式碼意義一致
class Student():
    def __init__(self,name='Noname',age=18):
        self.name = name 
        self.age = age 
    def say(self):
        print('My name is {0},I am {1}'.format(self.name,self.age))
def sayHello():
    print('Welcome to Wuzhi !')
 
if __name__ == '__main__':#使得下列輸出語句在模組被匯入時不執行,模組自身執行時執行
    print('我是模組')
stu =Student('goudan',18)
stu.say()
sayHello()
我是模組
My name is goudan,I am 18
Welcome to Wuzhi !

In [12]:

 

'''
#當模組檔案命名為數字開頭時,模組的引用需要藉助importlib包
import importlib
#相當於匯入一個叫01的模組,並把他賦值給haha
haha = importlib.import_module('01')
# 在之後引用函式等時 將 01 變為 haha 即可
stu = haha.Student()
stu.say()
'''

Out[12]:

"\n#當模組檔案命名為數字開頭時,模組的引用需要藉助importlib包\nimport importlib\n#相當於匯入一個叫01的模組,並把他賦值給haha\nhaha = importlib.import_module('01')\n# 在之後引用函式等時 將 01 變為 haha 即可\nstu = haha.Student()\nstu.say()\n"

模組的搜尋路徑和儲存

  • 搜尋路徑
    • 載入模組時,系統尋找模組的路徑
  • 系統預設模組搜尋路徑
          import sys
          sys.path 屬性可以獲取路徑列表
    
  • 新增搜尋路徑
          sys.path.append(dir)
    
  • 模組的載入順序
    • 1.搜尋記憶體上已經載入好的模組
    • 2.搜尋Python的內建模組
    • 3.搜尋sys.path路徑

  • 包是一種組織管理程式碼的方式,包裡面存放的是模組
  • 用於將模組包含在一起的資料夾就是包
  • 自定義包結構
      |---包
      |---|---__init__.py 包的標誌檔案
      |---|---模組1
      |---|---模組2
      |---|---子包(子檔案)
      |---|---|---__init__.py
      |---|---|---子包模組1
      |---|---|---子包模組2
    
  • 包的匯入操作
    • import package_name
      • 直接匯入一個包,可以使用init.py中的內容
      • 使用方法是:
          package_name:func_name
          package_name.class_name.func_name()
        
      • import package_name as 別名
        • 具體用法跟作用方式,跟上述簡單匯入一致
        • 注意的是此種方法是預設對init.py內容匯入
      • import package.module
        • 匯入包中某一具體的模組
        • 使用方法
            package.module.func_name
            package.module.class.fun()
            package.module.class.var
          
      • import package.module as 別名
    • from ...import 匯入
      • from package import module1,module2,...
      • 此種匯入不執行‘init’的內容
              from pkg01 import p01
              p01.sayHello()
        
      • from package import *
        • 匯入當前包‘init.py’檔案中的所有函式和類
        • 使用方法
            func_name()
            class_name.func_name()
            class_name.var
          
    • from package.module import *
      • 匯入包中指定模組的所有內容
      • 使用方法
              func_name()
              class_name.func_name()
        
    • 在開發環境中經常會用其他模組,可以在當前包中直接匯入其他模組中的內容
      • import 完整的包或者模組的路徑
    • all’的用法
      • 在使用from package import 的時候, 可以匯入的內容
      • init.py’中如果檔案為空,或者沒有‘all’,那麼只可以把‘init‘中的內容匯入
      • init‘如果設定了‘all’的值,那麼則按照‘all’指定的子包或者模組進行載入,如此則不會載入‘init‘中 的內容
      • all=['module1','module2',...]'

名稱空間

  • 用於區分不同位置不同功能但是相同名稱的函式或者變數的一個特定字首
  • 作用是防止命名衝突
                  setName()
                  Student.setName()
                  Dog.setName()