天天看點

開始Python -- 子產品(Modules)

1、子產品

(1)Python程式可以作為子產品導入

l         将Python程式儲存為.py檔案到指定目錄,例如:c:/python/hello.py

# hello.py

print "Hello, world!"

l         告訴Python子產品的位置,一種方法是将.py檔案的儲存目錄追加到Python的系統路徑中:

>>> import sys

>>> sys.path.append('c:/python')

l         這樣就可以導入程式了(子產品名即.py檔案名):

>>> import hello

Hello, world!

l         如果修改了程式,再次導入,程式什麼也沒有做:

>>> import hello

>>> 

l         這是因為子產品主要用來定義變量、函數和類,隻導入一次。

l         要重新導入的方法是使用内建的reload()函數:

>>> hello = reload(hello)

Hello, world!

(2)子產品用來定義變量、函數和類

l         子產品導入後,子產品中定義的變量、函數和類可以作為子產品的屬性使用

# hello2.py

def hello():

         print "Hello, world!"

>>> import hello2

>>> hello2.hello()

Hello, world!

(3)使你的子產品有效

l         通常不會像前面的方法一樣編輯sys.path,而是将子產品目錄放到系統預設的路徑中:

>>> import sys, pprint

>>> pprint.pprint(sys.path)

['',

 'C://WINDOWS//system32//python24.zip',

 'D://workshop//Python24//DLLs',

 'D://workshop//Python24//lib',

 'D://workshop//Python24//lib//plat-win',

 'D://workshop//Python24//lib//lib-tk',

 'D://workshop//Python24//Lib//site-packages//pythonwin',

 'D://workshop//Python24',

 'D://workshop//Python24//lib//site-packages',

 'D://workshop//Python24//lib//site-packages//win32',

 'D://workshop//Python24//lib//site-packages//win32//lib']

l         site-packages目錄通常是個不錯的選擇。

l         另外一種方法是将子產品目錄放到作業系統環境變量PYTHONPATH中。

l         UNIX的例子:

export PYTHONPATH=$PYTHONPATH:~/python

l         Windows的例子:

set PYTHONPATH=%PYTHONPATH%;C:/python

2、包(package)

(1)包的結構:

l         子產品儲存到.py檔案中;

l         包是目錄,但其中必須包含__init__.py的子產品;

l         子產品檔案儲存在包目錄中;

l         下面是個例子:

~/python/                          假設目錄加到PYTHONPATH中

~/python/drawing/                           包目錄(drawing包)

~/python/drawing/__init__.py       包目錄下的代碼(drawing子產品)

~/python/drawing/colors.py         colors子產品

~/python/drawing/shapes.py         shapes子產品

l         下面的導入都是合法的:

import drawing                     # 導入drawing包,隻有__init__子產品有效

import drawing.colors              # 導入colors子產品,使用全名drawing.colors通路

from drawing import shapes         # 導入shapes子產品,使用短名shapes通路

3、揭示子產品内容

(1)使用dir()函數

l         使用dir()函數揭示子產品内容:

>>> import copy

>>> [name for name in dir(copy) if name[0] != '_']

['Error', 'PyStringMap', 'copy', 'deepcopy', 'dispatch_table', 'error', 'inspect', 'name', 't']

(2)__all__變量

l         __all__變量用來定義子產品的公共接口

>>> copy.__all__

['Error', 'copy', 'deepcopy']

l         當用下面的導入語句時,__all__變量設定的函數(變量或類)可以直接引用:

from copy import *

l         而PyStringMap必須顯式導入,才可以直接引用:

from copy import PyStringMap

l         在編寫子產品時,設定__all__變量通常是個有用的技巧

(3)獲得幫助資訊

l         使用help()函數獲得幫助資訊

>>> help(copy.copy)

Help on function copy in module copy:

copy(x)

    Shallow copy operation on arbitrary Python objects.

    See the module's __doc__ string for more info.

l         文檔字元串是寫在函數(變量或類)的開始部分,用來文檔化的,儲存在__doc__屬性中:

>>> print copy.copy.__doc__

Shallow copy operation on arbitrary Python objects.

    See the module's __doc__ string for more info.

(4)檢視源代碼

l         使用子產品的__file__屬性,可以獲得子產品源代碼所在的位置

>>> print copy.__file__

D:/workshop/Python24/lib/copy.pyc

l         .pyc檔案是編譯過的Python檔案,在第一次導入子產品時建立(和.py檔案同一個目錄);在後續導入時使用該檔案,以提高Python的處理效率