python學習筆記6--python模塊

原文鏈接 http://blog.csdn.net/area_52/article/details/44171013

Python模塊

可以把python代碼存放在文件中,爲一些腳本或者交互式的解釋器實例使用,這個文件被稱爲模塊。

模塊是一個包含所有你定義的函數和變量的文件,其後綴名是.py 模塊可以被別的程序引入,以使用該模塊中的函數等功能。這也是使用python標準庫的方法。下面是一個使用Python標準庫中模塊的例子

<code class="hljs python has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> sys

print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'命令行參數如下:'</span>)
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> i <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span> sys.argv:
    print(i)

print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'/n/nThe PYTHONPATH is'</span>, sys.path, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'/n'</span>)</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

說明: 
①import sys引入python標準庫中的sys.py模塊;這是引入某一模塊的方法。 
②sys.argv是一個包含命令行參數的列表 
③sys.path包含了一個python解釋器自動查找所需模塊的路徑的列表。

搜索路徑實在python編譯或安裝的時候確定的,安裝新的庫應該也會修改。搜索路徑被存儲在sys模塊中的Path變量,如

<code class="hljs tex has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">>>> sys.path
<span class="hljs-special" style="box-sizing: border-box; color: rgb(102, 102, 0);">[</span>'', 'E:<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\\</span>python33<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\\</span>Lib<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\\</span>idlelib', 'C:<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\\</span>Windows<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\\</span>system32<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\\</span>python33.zip', 'E:<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\\</span>python33<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\\</span>DLLs', 'E:<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\\</span>python33<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\\</span>lib', 'E:<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\\</span>python33', 'E:<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\\</span>python33<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\\</span>lib<span class="hljs-command" style="box-sizing: border-box; color: rgb(0, 0, 136);">\\</span>site-packages'<span class="hljs-special" style="box-sizing: border-box; color: rgb(102, 102, 0);">]</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

sys.path輸出是一個列表,其中第一項是空串,代表當前目錄。可以在腳本中修改sys.path來引入一些不在搜索路徑中的模塊。如

<code class="hljs python has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#fibo.py文件</span>
<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">def</span> <span class="hljs-title" style="box-sizing: border-box;">fib</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(n)</span>:</span>    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"># write Fibonacci series up to n</span>
    a, b = <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> b < n:
        print(b, end=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">' '</span>)
        a, b = b, a+b
    print()</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li></ul>

然後在python解釋器導入 
import fibo

這樣做並沒有把直接定義在fibo中的函數名稱寫入到當前符號表裏,只是把模塊fibo的名字寫到了那裏。可以使用模塊名稱來訪問函數。 
如 
fibo.fib(1000)

1 1 2 3 5 8 13 21 34 5 89 144 233 377 610 987 
fibo._name_ 
‘fibo’

深入模塊

模塊除了方法定義,還可以包括可執行的代碼。這些代碼一般用來初始化這個模塊。這些代碼只有在第一次被導入時纔會被執行。

每個模塊有各自獨立的符號表,在模塊內部爲所有函數當做全局符號表來使用。所以,模塊的作者可以放心在模塊內部使用這些全局變量而不用擔心把其他用戶的全局變量搞花。

從另一個方面,當你確實知道你在做什麼的話,你也可以通過modname.itemname的方式來訪問模塊內的函數。模塊是可以導入其他模塊的。在一個模塊(或者腳本 或者其他地方)的最前面使用import來導入一個模塊,當然這只是一個慣例,不是強制的。被導入的模塊的名稱被放入當前操作的模塊的符號表中。 
還有一種導入的方法,可以使用import直接把模塊內(函數,變量的)名稱導入到當前操作模塊。 
from fibo import fib 
fib(500)

1 1 2 3 5 8 13 21 34 55 89 144 233 377 
這種導入方法不會把被導入的模塊的名稱放在當前的字符表中(所以在這個例子裏fibo這個名稱是沒有定義的)

還有一種方法,可以一次性把模塊中所有(函數 變量)名稱都導入到當前模塊的字符表 
from fibo import * 
fib(500)

1 1 2 3 5 8 13 21 34 55 89 144 233 377 
這將把所有的名字都導入進來。

_name_屬性

一個模塊被另一個程序第一次引入時,其主程序將運行。如果我們想在模塊被引入時,模塊中的某一程序塊不執行,我們可以用_name_屬性來使該程序塊僅在該模塊自身運行時執行

每個模塊都有一個_name_屬性,當其值是’_main_‘時,表明該模塊自身在運行,否則是被引入。

<code class="hljs python has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">#hello.py</span>
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> __name__ == <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'__main__'</span>:
    print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"程序自身在運行"</span>)
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span>:
    print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"我來自另一模塊"</span>)

python hello.py
>>>程序自身在運行

<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> hello
>>>我來自另一模塊</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>

dir()函數

內置的函數dir()可以找到模塊內定義的所有名稱。以一個字符串列表的形式返回:

<code class="hljs rust has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">import sys
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">dir</span>(sys)
>>>[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'__displayhook__'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'__doc__'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'__excepthook__'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'__loader__'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'__name__'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'__package__'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'__stderr__'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'__stdin__'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'__stdout__'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'_clear_type_cache'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'_current_frames'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'_debugmallocstats'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'_getframe'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'_home'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'_mercurial'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'_xoptions'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'abiflags'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'api_version'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'argv'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'base_exec_prefix'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'base_prefix'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'builtin_module_names'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'byteorder'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'call_tracing'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'callstats'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'copyright'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'displayhook'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'dont_write_bytecode'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'exc_info'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'excepthook'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'exec_prefix'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'executable'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'exit'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'flags'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'float_info'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'float_repr_style'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'getcheckinterval'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'getdefaultencoding'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'getdlopenflags'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'getfilesystemencoding'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'getobjects'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'getprofile'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'getrecursionlimit'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'getrefcount'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'getsizeof'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'getswitchinterval'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'gettotalrefcount'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'gettrace'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'hash_info'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'hexversion'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'implementation'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'int_info'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'intern'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'maxsize'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'maxunicode'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'meta_path'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'modules'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'path'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'path_hooks'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'path_importer_cache'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'platform'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'prefix'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'ps1'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'setcheckinterval'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'setdlopenflags'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'setprofile'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'setrecursionlimit'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'setswitchinterval'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'settrace'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'stderr'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'stdin'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'stdout'</span>,
 <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'thread_info'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'version'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'version_info'</span>, <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'warnoptions'</span>]</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul>

如果dir()沒有給定參數,那麼dir()函數會羅列出當前定義的所有名稱。

標準模塊

Python本身帶着一些標準的模塊庫。有些模塊直接被構建在解析器裏,這些雖然不是一些語言內置的功能,但是他卻能很高效的使用,甚至是系統級調用也沒問題。 
這些組件會根據不同的操作系統進行不同形式的配置,比如winreg這個模塊就只會提供給Windows系統。 
應該注意到這有一個特別的模塊sys,它內置在每一個Python解析器中,變量sys.ps1和sys.ps2定義了主提示符和副提示符所對應的字符串

<code class="hljs python has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">import</span> sys
<span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span>sys.ps1
<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'>>> '</span>
<span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span>sys.ps2
<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'... '</span>
<span class="hljs-prompt" style="color: rgb(0, 102, 102); box-sizing: border-box;">>>> </span>sys.ps1 = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'C> '</span>
C> print(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'Yuck!'</span>)
Yuck!
C></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

包是一種管理Python模塊命名空間的形式,採用”點模塊名稱”。 
比如一個模塊的名稱是A.B 那麼他表示一個包A中的子模塊B。 
如一個可能的包結構(在分層的文件系統中)

<code class="hljs r has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">sound/                          Top-level package
      __init__.py               Initialize the sound package
      formats/                  Subpackage <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> file format conversions
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>
      effects/                  Subpackage <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> sound effects
              __init__.py
              echo.py
              surround.py
              reverse.py
              <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span>
      filters/                  Subpackage <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> filters
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">...</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li></ul>

在導入一個包的時候,Python會根據sys.path中的目錄來尋找這個包中包含的子目錄。

目錄只有包含一個叫做_init_.py的文件纔會被認作是一個包,主要是爲了避免一些濫俗的名字(比如叫做String) 不小心影響到路徑中的有效模塊。

用戶可以每次只導入一個包裏面的特定模塊,比如 
import sound.effects.echo 
在訪問時必須使用全名去訪問: 
sound.effects.echo.echofilter(input,output,delay=0.7,atten=4)

還有一種導入子模塊的方法是: 
from sound.effects import echo 
這樣導入可以這樣使用: 
echo.echofilter(input,output,delay=0.7,atten=4)

還有一種變化就是直接導入一個函數或者變量: 
from sound.effects.echo import echofilter 
這樣導入可以直接使用 
echofliter(input,output,delay=0.7,atten=4)

注意:使用from package import item這種形式的時候 對應的item既可以是包裏面的子模塊(子包) 也可以是包裏面定義的其他名稱,比如函數,類或者變量 
import語法會首先把item當做一個包定義的名稱,如果沒找到,再試圖按照一個模塊去導入,如果還沒找到就拋出異常。

如果使用import item.subitem.subsubitem這種形式,除了最後一項,都必須是包,而最後一項可以使模塊,也可以是包,但是不可以是類,函數或者變量。

從一個包中導入

導入語句遵循如下規則:如果包定義文件_init_.py存在一個叫做_all_的列表變量,那麼在使用from package import *的時候就把這個列表中的所有名字作爲包內容導入。 
所以,作爲包的作者,可別忘了在更新包之後保證_all_也更新了。 
比如,在_init_.py中包含如下代碼: 
_all_ = [“echo”,”surround”,”reverse”] 
這表示,當使用from sound.effects import *這種用法時,你只會導入包中這三個子模塊。

如果_all_真的沒有定義,那麼使用from sound.effects import *這種語法的時候,就”不會”導入包:mod:sound.effects裏的任何子模塊。他只是把包mod:sound.effects和它裏面定義的所有內容導入進來(可能運行:file:_init_.py裏定義的初始化代碼) 
這會把:file:_init_.py裏面定義的所有名字導入進來,並且他不會破壞掉我們在這句話之前導入的所有明確指定的模塊 
如:

<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">import sound<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.effects</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.echo</span>
import sound<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.effects</span><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.surround</span>
from sound<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.effects</span> import *</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

在這裏,在執行from import之前,包:mod:sound.effects中的echo和surround模塊都被導入到當前的命名空間中了。(當然如果定義了_all_就更沒問題了)

記住使用from Package import specific_submodule這種方法永遠不會有錯。事實上,這也是推薦的方法。

PS:其實個人覺得python中的類和模塊的功能類似於c++中的類,只不過python中的模塊實質上是一個腳本文件,也就是一個.py的文件,當另外一個腳本文件需要調用,可進行函數或變量的重用,有點C++類中的繼承的意思
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章