15 模組 Module 和 包 package

2021-10-02 19:45:54 字數 4086 閱讀 1898

模組是乙個包含有一系列資料,函式,類等組成的程式組

模組是乙個檔案,模組檔名通常以『.py』結尾

讓一些相關的資料,函式,類等有邏輯的組織在一起,使邏輯結構更加清晰,

我們可以使用模組將大型程式分解為可管理的小型檔案,方便管理和應用。

模組中的變數,函式和類等可提供給其他模組或程式使用,重用性強

內建模組(builtins)在解析器的內部是可以直接使用

標準庫模組,安裝python時已安裝可直接使用

第三方模組(通常為開源),需要自己安裝

使用者自己編定的模組(可以作為其他人的第三方模組)

import mymod

import  imp

模組被匯入和執行的過程:

1、先搜尋相關路徑找模組(.py檔案)

2、判斷是否有此模組對應的.py檔案,如果.pyc檔案閉.py檔案新,則直接加在.pyc檔案

3、否則用模組.py 檔案生成.pyc並載入執行。

pyc模組的編譯:

mymod.py-----編譯-->mymod.pyc -----解釋執行--->

>>> import imp

>>> import my_module

這段**被執行了

>>> import my_module

>>> imp.reload(my_module)

這段**被執行了

import math # 匯入數學模組

import sys,os #匯入sys 和 os 模組

import copy as cp #給copy起乙個新的名字cp

from math impor pi

from math import sin

from math import factorial as fac

from math import *

s = sin(pi/2)

"""這是乙個模組名字

這個模組是幹什麼幹什麼的。

"""def hello():

"""這是乙個hello函式的名字

這個模組有這樣的功能。

"""pass

print(__file__)

print("++++++++")

print(__doc__)

print("++++++++++")

print(help(__name__))

執行結果:

c:\users\administrator\documents\aptana studio 3 workspace\demo1\123.py

++++++++

這是乙個模組名字

這個模組是幹什麼幹什麼的。

++++++++++

help on module __main__:

name

__main__ - 這是乙個模組名字

description

這個模組是幹什麼幹什麼的。

functions

hello()

這是乙個hello函式的名字

這個模組有這樣的功能。

data

__annotations__ = {}

file

c:\users\administrator\documents\aptana studio 3 workspace\demo1\123.py

none

#__all__列表限定其他模組再用 from 模組名  import * 匯入時

#只匯入 __all__列表內部限定的。

__all__ = ['myfun1','myfun3','name1']

print(dir())

def myfun1():

print('myfun1被呼叫')

def myfun2():

print('myfun2被呼叫')

def myfun3():

print('myfun2被呼叫')

name1 = 'xiaomimg'

name2 = 'xiaohong'

'''此模組示意隱藏屬性以及其用法

以『__'開頭的變數在被from *** import *

(其它匯入不算)匯入時,不被匯入。

'''def f():

print('f函式被呼叫')#匯入

def _f():#不被匯入

print('f函式被呼叫')

def __f():#不被匯入

print('f函式被呼叫')

name = 'aa'#匯入

_name = 'bbbb'#不被匯入

__name = 'cccc'#不被匯入

設想一下,如果我們使用 from sound.effects import *會發生什麼?

python 會進入檔案系統,找到這個包裡面所有的子模組,乙個乙個的把它們都匯入進來。

但是很不幸,這個方法在 windows平台上工作的就不是非常好,因為windows是乙個大小寫不區分的系統。

在這類平台上,沒有人敢擔保乙個叫做 echo.py 的檔案匯入為模組 echo 還是 echo 甚至 echo。

(例如,windows 95就很討厭的把每乙個檔案的首字母大寫顯示)而且 dos 的 8+3 命名規則對長模組名稱的處理會把問題搞得更糾結。

為了解決這個問題,只能煩勞包作者提供乙個精確的包的索引了。

匯入語句遵循如下規則:如果包定義檔案 __init__.py 存在乙個叫做 __all__ 的列表變數,那麼在使用 from package import * 的時候就把這個列表中的所有名字作為包內容匯入。

作為包的作者,可別忘了在更新包之後保證 __all__ 也更新了啊。你說我就不這麼做,我就不使用匯入*這種用法,好吧,沒問題,誰讓你是老闆呢。這裡有乙個例子,在:file:sounds/effects/__init__.py中包含如下**:

如果 __all__ 真的沒有定義,那麼使用from sound.effects import *這種語法的時候,就不會匯入包 sound.effects 裡的任何子模組。他只是把包sound.effects和它裡面定義的所有內容匯入進來(可能執行__init__.py裡定義的初始化**)。

這會把 __init__.py 裡面定義的所有名字匯入進來。並且他不會破壞掉我們在這句話之前匯入的所有明確指定的模組

通常我們並不主張使用 * 這種方法來匯入模組,因為這種方法經常會導致**的可讀性降低。不過這樣倒的確是可以省去不少敲鍵的功夫,而且一些模組都設計成了只能通過特定的方法匯入。

記住,使用 from package import specific_submodule 這種方法永遠不會有錯。事實上,這也是推薦的方法。除非是你要匯入的子模組有可能和其他包的子模組重名。

如果在結構中包是乙個子包(比如這個例子中對於包sound來說),而你又想匯入兄弟包(同級別的包)你就得使用匯入絕對的路徑來匯入。比如,如果模組sound.filters.vocoder 要使用包 sound.effects 中的模組 echo,你就要寫成 from sound.effects import echo。

from .open import hello #假設有hello這個函式

from ..sound import play

Python隨心記 module模組和包

import sysprint sys.path 列印python直譯器的路由 新增路徑 臨時修改 module模組和包 packge,該檔案下有個 init py檔案 import module module 引入模組 模組一共三種 python標準庫模組 第三方模組 應用程式自定義模組 引入自定...

第十七課 模組 module和包

第十七課 模組 module和包 模組是乙個包含有一系列變數,函式,類等組成的程式組 模組是乙個檔案,模組檔案問通常已.py結尾 分類 1.內建模組 bit 2.安裝的標準庫模組 3.第三方模組,需要自己安裝 4.使用者自己編寫的模組 模組的匯入 import 語句 語法import 模組名1 as...

day06 1 module模組和包介紹

為了編寫可維護的 我們把很多函式分組,分別放到不同的檔案裡,這樣每個檔案包含的 就相對較少,很多程式語言都採用這種組織 的方式。在python中,乙個.py檔案就稱之為乙個模組 module 使用模組最大的好處是提高了 的可維護性 其次,提高了 開發的效率,編寫 不必從零開始,當乙個模組編寫完成,就...