Python基礎-包與模塊

来源:http://www.cnblogs.com/crazyrunning/archive/2017/06/16/7025890.html
-Advertisement-
Play Games

1. 為重用以及更好的維護代碼,`Python`使用了模塊與包;一個`Python`文件就是一個模塊,包是組織模塊的特殊目錄(包含`__init__.py`文件)。 2. 模塊搜索路徑,`Python`解釋器在特定的目錄中搜索模塊,運行時`sys.path`即搜索路徑。 3. 使用`import`關... ...


Python基礎-包與模塊

寫在前面

如非特別說明,下文均基於Python3

摘要

  1. 為重用以及更好的維護代碼,Python使用了模塊與包;一個Python文件就是一個模塊,包是組織模塊的特殊目錄(包含__init__.py文件)。
  2. 模塊搜索路徑,Python解釋器在特定的目錄中搜索模塊,運行時sys.path即搜索路徑。
  3. 使用import關鍵字導入模塊,註意 import *__all__的關係。

1. 模塊與導入

A module is a file containing Python definitions and statements

Python模塊就是包含定義以及語句的文件,文件名是模塊的名字加上.py尾碼。

1.1 為重用而生

假設有一個完成特定功能,很好用的函數或者類。為了使用這個功能,不得不把這段代碼複製到需要使用的每一個文件中。重覆代碼是編程的大忌,如果功能實現需要修改,會不得不修改每一個出現的地方,這是反人類的。

重用能夠很好的解決這一問題,實際上,函數,類等結構在一定程度上也為重用提供了便利。

Python中,將一系列相關的函數,類等組織在一個文件中,每一個文件都是一個Python模塊。

1.2 導入模塊

使用import關鍵字導入模塊(模塊需在搜索路徑中):

  1. import sys;基礎導入語句。
  2. import sys as system;為導入的名字起別名。
  3. from sys import path;導入模塊特定元素。
  4. from sys import *;從sys中導入全部可導入名字

import-only-once
模塊只導入一次這種行為在大多數情況下是一種實質性的優化,在同一個解釋器生命周期內,多次使用import語句導入同一個模塊,導入只發生一次。

這一點可以在模塊中加入輸出語句證明。

import *__all__
使用import *可能會污染當前模塊的名字空間,導入了一些不需要引用的名字。因此不推薦使用。

事實上,規範的第三方模塊會提供一個模塊公共介面,暴露該模塊可用的介面。公共介面由模塊名為__all__的列表定義。

如定義名為mtest1的模塊:


__all__ = ['test1', 'test12']

def test1():
    print('test1')

def test11():
    print('test11')

def test12():
    print('test12')

使用全部導入的方式:

>>> form mtest1 import *
>>> dir()
>>> ['__annotations__', '__builtins__', '__doc__', '__loader__','__name__', '__package__', '__spec__', 'test1', 'test12']

可以看到函數test11()並沒有被導入,這就是__all__的作用了。

2. 包與其構建

為了更好組織模塊,將模塊分組為包(package)。

2.1 包是特殊模塊

從文件系統上看,包就是模塊所在目錄。為使Python解釋器將其區別普通目錄作為包看待,包中必須直接包含一個名為__init__.py的文件(模塊)。

包基本上就是另外一類模塊,不同的地方在於包能包含其他模塊與包。包作為一個模塊,其內容其實就是文件__init__.py(模塊)的內容。

如名為constants的包,文件constants/__init__.py如下:

PI = 3.14

那麼可以將包constants作為普通模塊對待:

import constants
print(constants.PI)
2.2 構建包

如果要構建一個名為drawing的包,其中包含shapescolors模塊,需要創建一下目錄和文件:

文件/目錄 描述
~/python 加入到搜索路徑中的目錄
~/python/drawing 包目錄(drawing包)
~/python/drawing/__init__.py 包代碼(drawing模塊)
~/python/drawing/colors.py color模塊
~/python/drawing/shapes.py shapes模塊

假設已經將~/python作為搜索目錄。依照這個設置,下列導入語句都是合法的:

  1. import drawing # 導入drawing包(即__init__.py模塊)
  2. import drawing.colors # 導入colors模塊,使用drawing.colors.attr的方式引用
  3. from drawing import shapes # 導入shapes模塊

__all__變數
與模塊的__all__變數相似,包的__all__變數決定了使用from package import *導入的子模塊。

如以上drawing包的__init__.py文件內容如下:

__all__ = ['colors']

那麼使用from drawing import *只會導入colors模塊。

3. 搜索路徑

現在已經編寫完了一個很好用的模塊,並且通過了測試。那麼如何讓這個模塊可用呢?即如何讓這個模塊具備可導入到其他模塊的能力。

3.1 搜索模塊

當使用import語句導入模塊時,Python解釋器通過以下方式搜索模塊:

  1. 首先搜索built-in模塊
  2. 最後搜索變數sys.path提供的路徑列表

sys.path在解釋器啟動時從以下位置初始化:

  1. 當前腳本路徑
  2. 環境變數PYTHONPATH指定的路徑集合
  3. 安裝預設路徑

sys.path初始化完成後,可以在運行時修改。

3.2 讓模塊可用

那麼現在若要使模塊可用,一是將其放置到已有的搜索路徑下,二是指定模塊所在路徑為搜索路徑。

一般情況下,若選擇第一種方式,我們將模塊放置到Python安裝路徑的\lib\site-packages下,這個目錄是專門用來安裝第三方模塊的。正如該目錄下的README文件展示的那樣:

This directory exists so that 3rd party packages can be installed here. Read the source for site.py for more details.

若選擇第二種方式,直接將模塊所在目錄加入到環境變數PYTHONPATH中即可。

值得註意的是,可以在\lib\site-packages路徑下新建一個名為user_lib.pth的文件,內容是需要搜索的路徑,一行一個,也可以將指定路徑加入到搜索目錄中:

user_lin.pth


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 學習Java繼承之前,我們想回憶一下Java面向對象需要特別註意的幾個關鍵點。 面向對象是將複雜的事情簡單化了,它通過封裝的方式使得代碼的重用性更高和安全性更強。平時我們要學會用面向對象的方式去思考,去描述事物或行為。 想要使用OOP,一定要清楚其三個主要特征: 1.對象的行為(behavior): ...
  • 1、問題:啟動Tomcat時報錯! 主要錯誤代碼如下 1 1 在這段代碼之前還有錯誤代碼: 1 1 2、出現錯誤的環境:spring MVC + MyBatis框架下,涉及有control層、service層、dao層。 3、問題分析:一開始以為是由於control層使用@Resource出現的異常 ...
  • 最近開發一個項目,需要調用第三方的介面,第三方提供的數據是xml,我直接使用Array2XML把php數組轉成XML格式。 XML格式如: 由於php數組無法指定多個重覆下標,後面的會覆蓋前面的值,最終只會展示一個值 上面php數組用Array2XML轉成XML,body裡面只會有一個item節點。 ...
  • 本文為公司製作API介面後臺的小結! 1.命名註意事項: 不要使用易混淆的名字,如index,index01... 我喜歡用拼音... 比如: 2.資料庫文件修改: 去database.php里把數據得首碼去掉; 3.獲取請求的值: 4.操作資料庫: (1)原生操作: (2)name查詢: 5.返回 ...
  • 前言: 這幾天剛剛開始學習python,然後就安裝了pycharm,但是那個中文亂碼的問題真是讓人心煩,在網上找了好久,都寫得好亂,今天終於讓我解決了,在這裡總結一下經驗,希望可以幫到你們 問題:如下圖,我的問題主要是在控制台輸入漢字的時候會出現以下亂碼 一般的解決方法 1. 首先如上圖所示,把fi ...
  • Java 數據類型 基本數據類型 數值:int、short、long 字元:char 布爾:boolean 引用數據類型 class(類) interface(介面) 數組[] 所占位元組數 ( ) int:4位元組 char: 規定2位元組。若使用UTF 8編碼,數字和英文等占1個位元組,中文3個位元組;若 ...
  • 目錄 自定義函數 內置函數 文件的操作 練習題 一. 自定義函數 1. 函數的創建 2. 函數的參數 (1)參數的定義 參數是使用通用變數來建立函數和變數之間關係的一個變數。我們都知道函數是用來被調用的,當我們需要給這個函數傳送值的時候,參數用來接收調用者傳遞過來的數據,並保存下來作為一個變數以便後 ...
  • re模塊 序言: re模塊用於對python的正則表達式的操作 標誌位即模式修正符,不改變正則表達式的情況下,通過模式修正符改變正則表達式的含義,從而實現一些匹配結果的調整等功能: 貪婪模式、懶惰模式: match: 從起始位置開始根據模型去字元串中匹配指定內容: 匹配ip地址: search: 根 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...