跟老齊學Python之Import 模組

來源:互聯網
上載者:User
認識模組

對於模組,在前面的一些舉例中,已經涉及到了,比如曾經有過:import random (擷取隨機數模組)。為了能夠對模組有一個清晰的瞭解,首先要看看什麼模組,這裡選取官方文檔中對它的定義:

代碼如下:


A module is a file containing Python definitions and statements. The file name is the module name with the suffix .py appended. Within a module, the module's name (as a string) is available as the value of the global variable name.

都是洋碼子,翻譯一下不?不!還是只說要點:
•模組就是一個含有python語句的檔案
•模組名就是檔案名稱(不要副檔名.py)

那麼,那個import random的檔案在哪裡呢?

用曾經講過的那個法寶:help()函數看看:

代碼如下:


>>> help(random)

然後就出現:

代碼如下:


NAME
random - Random variable generators.

FILE
/usr/local/lib/python2.7/random.py

MODULE DOCS
http://docs.python.org/library/random

DESCRIPTION
...

這裡非常明顯的告訴我們,random模組的檔案就是: /usr/local/lib/python2.7/random.py(注意:這個地址是我的電腦中的地址,可能跟看官的不一樣,特別是如果看官用的是windows,肯定跟我這個不一樣了。)

看官這時候可能有疑問了,import是怎麼找到那個檔案的?類似檔案怎麼寫?不用著急,這些我都會一一道來。

標準庫

看了前面的random這個例子,看官可能立刻想到一個問題:是不是已經有人把很多常用的功能都寫成模組了?然後使用者只需要用類似方法調用即可。的確是,比如上面顯示的,就不是某個程式員在使用的時候自己編寫的,而是在安裝python的時候,就被安裝在了電腦裡面。觀察那個檔案儲存體地址,就知道了。

我根據上面得到的地址,列出/usr/local/lib/python2.7/裡面的檔案,這些檔案就是類似random的模組,由於是python安裝就有的,算是標配吧,給它們一個名字“標準模組庫”,簡稱“標準庫”。

這張圖列出了很少一部分存在這個目錄中的模組檔案。

Python的標準庫(standard library)是Python的一個組成部分,也是Python為的利器,可以讓編程事半功倍。

如果看官有時間,請經常訪問:https://docs.python.org/2/library/,這裡列出了所有標準庫的使用方法。

有一點,請看官特別注意,對於標準庫而言,由於內容太多,恐怕是記不住的。也不用可以的去記憶,只需要知道有這麼一個東西。如果在編寫程式的時候,一定要想到,對於某個東西,是不是會有標準庫支援呢?然後就到google或者上面給出的地址上搜尋。

舉例:

代碼如下:


>>> import sys #匯入了標準庫sys
>>> dir(sys) #如果不到網頁上看,用這種方法可以查看這個標準庫提供的各種方法(函數)
['__displayhook__', '__doc__', '__egginsert', '__excepthook__', '__name__', '__package__', '__plen', '__stderr__', '__stdin__', '__stdout__', '_clear_type_cache', '_current_frames', '_getframe', '_mercurial', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_clear', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'gettrace', 'hexversion', 'last_traceback', 'last_type', 'last_value', 'long_info', 'maxint', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1', 'ps2', 'py3kwarning', 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions']
>>> sys.platform #比如這個
'linux2'
>>> sys.version #還有這個
'2.7.6 (default, Nov 13 2013, 19:24:16) \n[GCC 4.6.3]'

>>> help(sys.stdin) #這是查看某個模組方法具體內容的方式

標準庫,在編程中經常用到。這裡不贅述。只要看官能夠知道在哪裡找、如何找所需要的標準庫即可。

自己編寫模組

看官可能比較喜歡“自己動手,豐衣足食”(雖然真的不一定是豐衣足食),在某些必要的時候,還真得自己動手寫一些模組。那麼怎麼編寫模組呢?

前面已經交代,模組就是.py檔案,所以,只要將某些語句寫到一個.py檔案中,它就是一個模組了。沒有什麼太多的秘密。

在某個目錄下面建立了一個檔案,名稱是:mmmm.py,如所示,然後編輯這個檔案內容。編輯好後儲存。

代碼是檔案內容:

代碼如下:


#!/usr/bin/env python
#coding:utf-8

web = "https://qiwsir.github.io"

def my_name(name):
print name

class pythoner:
def __init__(self,lang):
self.lang = lang
def programmer(self):
print "python programmer language is: ",self.lang

圖示是檔案所在目錄,並且在該目錄下開啟了python的互動模式(我這是在ubuntu下,看官是別的作業系統的化,注意路徑,如果遇到問題,可以暫時擱置,看下文)。

可以看出,目前的目錄中有這個檔案:mmmm.py

在互動模式下,仿照對標準庫模組的操作方式:

代碼如下:


>>> import mmmm
>>> dir(mmmm)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'my_name', 'pythoner', 'web']
>>> mmmm.__doc__ #這個是空的,正是,因為我未曾寫過任何文檔說明
>>> mmmm.__name__ #名字
'mmmm'
>>> mmmm.__file__ #檔案
'mmmm.py'

再看後面的:my_name,pythoner,web,都是我在內容中自己寫的。

代碼如下:


>>> mmmm.web
'https://qiwsir.github.io'

web是模組mmmm中的一個通過指派陳述式建立的變數,在這裡,它編程了mmmm的屬性,能夠通過點號運算訪問,其實不僅僅是這類型的賦值,其它通過def,class等,都能做為mmmm模組的屬性。

代碼如下:


>>> mmmm.my_name

>>> mmmm.pythoner

當然,跟操作標準庫一樣,一樣能夠使用help()來看看這些屬性的具體內容:

代碼如下:


>>> help(mmmm.my_name)

Help on function my_name in module mmmm:

my_name(name)

>>> help(mmmm.pythoner)

Help on class pythoner in module mmmm:

class pythoner
| Methods defined here:
|
| __init__(self, lang)
|
| programmer(self)

怎麼調用呢?這樣即可:

代碼如下:


>>> mmmm.my_name("qiwsir")
qiwsir

當調用模組中的函數的時候,用模組的名稱(import mmmm)+點號+函數(注意,函數後面要有括弧,如果有參數,括弧裡面跟參數),即 module_name.funciton(*args)

代碼如下:


>>> py = mmmm.pythoner("c++")
>>> py.programmer()
python programmer language is: c++

上面兩行,則是示範用綁定的方法調用模組中的類以及類的執行個體方法。跟以往的相比較,似乎都是在前面多了一個mmmm.

如果感覺這個mmmm比較麻煩,可以用from,具體是這樣的:

代碼如下:


>>> from mmmm import *
>>> my_name('qiwsir')
qiwsir
>>> web
'https://qiwsir.github.io'
>>> py = pythoner("c++")
>>> py.programmer()
python programmer language is: c++

這次不用總寫那麼mmmm了。兩種方式,哪個更好呢?沒有定論。看官在以後的實踐中體會,什麼時候用什麼方式。

上面用from mmmm import ,其中符號,表示將所有的都import進來,用這個方法,也可以只import一部分,如同:

代碼如下:


>>> from mmmm import my_name #如果看官前面運行了上述操作,需要關閉互動模式,
#再重啟,才能看到下面過程
>>> my_name("qiwsir")
qiwsir
>>> web #沒有import這個,所以報錯。
Traceback (most recent call last):
File "", line 1, in
NameError: name 'web' is not defined

這就是基本的import模組方法。看官的疑問,還要存著。且聽下回分解。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.