首頁 >後端開發 >Python教學 >Python基礎-套件與模組詳解

Python基礎-套件與模組詳解

PHP中文网
PHP中文网原創
2017-06-20 16:49:311919瀏覽

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 constantsprint(constants.PI)
2.2 建置套件

如果要建置一個名為drawing的套件,其中包含shapescolors模組,需要建立目錄和檔案:

##~/python /drawing套件目錄(drawing套件)~/python/drawing/__init__.py套件程式碼(drawing模組)~/python/drawing/colors.pycolor模組~/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的文件,内容是需要搜索的路径,一行一个,也可以将指定路径加入到搜索目录中:

Python基礎-套件與模組詳解

檔案/目錄 描述
~/python #加入到搜尋路徑中的目錄

以上是Python基礎-套件與模組詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn