天天看點

深入解析Python子產品引入機制

深入解析Python子產品引入機制

講完了函數的一些概念,我們來說Python的子產品引入,python裡面有大量的現成的子產品可以使用,不用我們自己造輪子。

1.子產品的好處:

a).打個比方我們要造一個自行車,我們并不需要去制造橡膠,鋼筋,輪胎,我們隻需要買一些現成的輪子,龍頭,把手,組裝一下就可以了。Python也是這樣,我們有的時候代碼需要一些功能,而這些功能在标準庫裡面或者第三方庫裡面早就寫好我的,我們要做的就是引入而已.

b).當你的代碼量變大的時候,你肯定需要封裝和抽象,要提高可維護性,必須要把你的功能函數子產品化.

c).子產品還可以避免函數名和變量名沖突。相同名字的函數和變量完全可以分别存在不同的子產品中,java裡面也有類似的概念.

2.子產品的種類:

1)使用者自己寫的自定義子產品

2)Python标準庫子產品

3)第三方子產品//通過pip install

有人說,說了這麼多,到底Python子產品實體上是什麼,其實就是一個檔案,一個python檔案而已.子產品的檔案名就是子產品的名字加上擴充名.py.(聰明的同學一定會問若有兩個相同名字的子產品怎麼差別,哇都會搶答了,先放一下我最後回答).

下面我們從一個小例子,'2行代碼看優酷視訊'來帶領大家走進我們今天的話題.

import webbrowser

webbrowser.open("http://v.youku.com/v_show/id_XNDc2NDk5OTI0.html?from=s1.8-1-1.2&spm=a2h0k.8191407.0.0")

這兩行代碼就能看打開浏覽器然後看一個視訊,這個連結是Google創始人在密西根大學的一個演講.是不是很神奇,2行搞定,其實就是引入一個子產品(用現成的子產品就是爽,哈哈),然後調用裡面的open函數搞定了.

webbrowser其實是一個檔案叫webbrowser.py 裡面有一個open函數.

webbrowser.py

def open():

...

下面我們就詳細講一下           

假設你有一個HiPython目錄,它的結構如下:

|-----init.py

|-----main.py

|-----sched.py

裡面有3個檔案init.py,main.py和sched.py ,這3個檔案我解釋一下:

  • 一個目錄要想作為python的子產品包必須含有init.py這個檔案夾(這是python設定死的,原因是因為python設計的時候搜尋到目錄下有這個特殊檔案認為這個目錄是python的子產品包否則就是普通目錄)
  • main.py是我們自己寫的一個python檔案
  • sched.py也我們自己寫的,有人說這個名字怎麼和python标準庫裡面的名字一樣啊,要的就是這效果,我們接着講~~
====sched.py===
a=100

====main.py====
import sched
print sched.a           
100

我們看看執行main.py的時候發生了什麼,首先引入了sched子產品,這個子產品的名字其實和标準庫裡面的是一模一樣的。但是為啥調用我們的自己的子產品,而不是标準庫裡面的.這是python子產品搜尋機制決定的.

3.Python的子產品搜尋機制:

1)程式的目前目錄

2)PYTHONPATH目錄,也就是環境變量裡面設定的PYTHON目錄

3)标準庫的目錄

目前目錄:

也就是你程式運作的主目錄,Python會首先在主目錄内搜尋導入的檔案,這個目錄總是被先搜尋.

PYTHONPATH目錄:

有同學會說這個是什麼東東,這個其實就是環境變量,一般安裝程式之後都會電腦上面設定一些環境變量的路徑。不行你話win使用者你可以在

我的電腦/進階系統設定/進階/環境變量 點開看看

标準庫的目錄:

Python自動搜尋标準庫安裝在機器上的那些目錄,比如C:\Python27\lib

說了這麼多大家也許不信,大家可以敲一下

import sys

print('The PYTHONPATH is', sys.path)

裡面就是包含裡python 子產品搜尋目錄list,看一下你就茅塞頓開啦!

4.子產品引用的形式

1).import module

這種是完全引入,比如import os ,就會把os下面的所有的變量,函數,類全部引入。然後你調用子產品的函數隻需要敲os.listdir(),就可以調用裡面的listdir()函數。

但是這種引入會有一個弊端,就是有一些函數你不需要用到,但是因為你的全部引入,這樣當你引入外部子產品很多的時候,比較浪費性能,開銷比較大,是以我們推薦第二種引入方法

2).from module import printer

部分引入,就是你隻引入你需要的函數,而且還有一個好處就是直接在腳本中使用複制後的變量名。

比如直接敲printer('Hi Python')而不用敲module.printer('Hi Python'),可以少敲一些字

3).import module as xx

這其實就是别名,比如import numpy as np ,其實就是少敲一些字,np是numpy的别名而已.

5.import和from都是指派語句

就跟def一樣,import和from都是可執行語句,而不是編譯期間的聲明。千萬要記住python的動态編譯的,隻有到執行的時候,python才會運作這些語言.而且可以套嵌在if語句中,如果大家看過一些開源庫的源代碼就會發現有大量的這樣的用法.