在Python中使用模組的教程

來源:互聯網
上載者:User
Python本身就內建了很多非常有用的模組,只要安裝完畢,這些模組就可以立刻使用。

我們以內建的sys模組為例,編寫一個hello的模組:

#!/usr/bin/env python# -*- coding: utf-8 -*-' a test module '__author__ = 'Michael Liao'import sysdef test():  args = sys.argv  if len(args)==1:    print 'Hello, world!'  elif len(args)==2:    print 'Hello, %s!' % args[1]  else:    print 'Too many arguments!'if __name__=='__main__':  test()

第1行和第2行是標準注釋,第1行注釋可以讓這個hello.py檔案直接在Unix/Linux/Mac上運行,第2行注釋表示.py檔案本身使用標準UTF-8編碼;

第4行是一個字串,表示模組的文檔注釋,任何模組代碼的第一個字串都被視為模組的文檔注釋;

第6行使用__author__變數把作者寫進去,這樣當你公開原始碼後別人就可以瞻仰你的大名;

以上就是Python模組的標準檔案模板,當然也可以全部刪掉不寫,但是,按標準辦事肯定沒錯。

後面開始就是真正的代碼部分。

你可能注意到了,使用sys模組的第一步,就是匯入該模組:

import sys

匯入sys模組後,我們就有了變數sys指向該模組,利用sys這個變數,就可以訪問sys模組的所有功能。

sys模組有一個argv變數,用list儲存了命令列的所有參數。argv至少有一個元素,因為第一個參數永遠是該.py檔案的名稱,例如:

運行python hello.py獲得的sys.argv就是['hello.py'];

運行python hello.py Michael獲得的sys.argv就是['hello.py', 'Michael]。

最後,注意到這兩行代碼:

if __name__=='__main__':  test()

當我們在命令列運行hello模組檔案時,Python解譯器把一個特殊變數__name__置為__main__,而如果在其他地方匯入該hello模組時,if判斷將失敗,因此,這種if測試可以讓一個模組通過命令列運行時執行一些額外的代碼,最常見的就是運行測試。

我們可以用命令列運行hello.py看看效果:

$ python hello.pyHello, world!$ python hello.py MichaelHello, Michael!

如果啟動Python互動環境,再匯入hello模組:

$ pythonPython 2.7.5 (default, Aug 25 2013, 00:04:04) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwinType "help", "copyright", "credits" or "license" for more information.>>> import hello>>>

匯入時,沒有列印Hello, word!,因為沒有執行test()函數。

調用hello.test()時,才能列印出Hello, word!:

>>> hello.test()Hello, world!

別名

匯入模組時,還可以使用別名,這樣,可以在運行時根據當前環境選擇最合適的模組。比如Python標準庫一般會提供StringIO和cStringIO兩個庫,這兩個庫的介面和功能是一樣的,但是cStringIO是C寫的,速度更快,所以,你會經常看到這樣的寫法:

try:  import cStringIO as StringIOexcept ImportError: # 匯入失敗會捕獲到ImportError  import StringIO

這樣就可以優先匯入cStringIO。如果有些平台不提供cStringIO,還可以降級使用StringIO。匯入cStringIO時,用import ... as ...指定了別名StringIO,因此,後續代碼引用StringIO即可正常工作。

還有類似simplejson這樣的庫,在Python 2.6之前是獨立的第三方庫,從2.6開始內建,所以,會有這樣的寫法:

try:  import json # python >= 2.6except ImportError:  import simplejson as json # python <= 2.5

由於Python是動態語言,函數簽名一致介面就一樣,因此,無論匯入哪個模組後續代碼都能正常工作。
範圍

在一個模組中,我們可能會定義很多函數和變數,但有的函數和變數我們希望給別人使用,有的函數和變數我們希望僅僅在模組內部使用。在Python中,是通過_首碼來實現的。

正常的函數和變數名是公開的(public),可以被直接引用,比如:abc,x123,PI等;

類似__xxx__這樣的變數是特殊變數,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊變數,hello模組定義的文檔注釋也可以用特殊變數__doc__訪問,我們自己的變數一般不要用這種變數名;

類似_xxx和__xxx這樣的函數或變數就是非公開的(private),不應該被直接引用,比如_abc,__abc等;

之所以我們說,private函數和變數“不應該”被直接引用,而不是“不能”被直接引用,是因為Python並沒有一種方法可以完全限制訪問private函數或變數,但是,從編程習慣上不應該引用private函數或變數。

private函數或變數不應該被別人引用,那它們有什麼用呢?請看例子:

def _private_1(name):  return 'Hello, %s' % namedef _private_2(name):  return 'Hi, %s' % namedef greeting(name):  if len(name) > 3:    return _private_1(name)  else:    return _private_2(name)

我們在模組裡公開greeting()函數,而把內部邏輯用private函數隱藏起來了,這樣,調用greeting()函數不用關心內部的private函數細節,這也是一種非常有用的代碼封裝和抽象的方法,即:

外部不需要引用的函數全部定義成private,只有外部需要引用的函數才定義為public。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.