模塊,import,from xxx import xxx

一,模塊

  模塊就是一個包含了python定義和聲明的文件,文件名就是模塊的名字加上.py後綴,整體來講,import加載的模塊一共分紅四個通用的類別:python

  1,使用python編寫的py文件
json

  2,已被變異爲共享或者DLL或者C++的擴展dom

  3,包好一組模塊的包spa

  4,使用c編寫並鏈接到python解釋器的內置模塊code

  爲何要使用模塊?爲了咱們寫的代碼能夠重用不至於把全部的代碼都寫在一個文件內,當項目規模比較小的時候,徹底可使用一個py搞定整個項目的開發,可是若是是一個很是大的項目,此時就必需要把相關的功能進行分離,方便咱們平常維護,以及新項目的開發,導入模塊有兩種方式:blog

  1,import 模塊開發

  2,from xxx import xxxclass

二,import

  首先建一個tang.py文件。 import

name='糖糖'
def xihuan():
    print('%s喜歡看小說'%name)
    print('她喜歡畫畫')
    print('她喜歡喝冰紅茶')
    print('她喜歡吃胡豆')
xihuan()

  接下來,再建一個py文件,在這個文件中導入tang模塊。變量

import tang   #此時運行新建的py文件時,會默認執行tang模塊中的代碼
import tang #無論後面調用幾回,都是沒有效果的,模塊是不可以重複導入的
import tang
print(tang.name)
tang.xihuan() #在引入模塊後,就能夠調用tang模塊中的屬性和方法

  導入模塊的時候都作了些什麼?首先,在導入模塊的一瞬間,python解釋器會先經過sys.mudules來判斷該模塊是否已經導入過了,若是導入過了就不在導入,若是該模塊還沒導入過,則系統會作三件事:

  1,爲導入的模塊創立新的名稱空間

  2,在新建立的名稱空間中運行該模塊中的代碼

  3,建立模塊的名字,並使用該名稱做爲該模塊在當前模塊中引用的名字

  注意:因爲模塊在導入的時候會建立本身的名稱空間,因此,咱們在使用模塊中的變量的時候通常是不會產生衝突的。

import tang
name='糖兒'
tang.xihuan()  #結果仍是用的是tang中的‘糖糖’

  注意:在模塊中使用global,咱們以前說global表示把全局的內容引入進到局部,可是,這個全局指的是py文件,換句話說,global指向的是模塊內部,並不會改變外部模塊的內容

tang.py
name='糖糖'
def xihuan():
  global name
  name='糖糖糖'
  print(name)

111.py
import tang
name='唐兒'
tang.xihuan() #結果是‘糖糖糖’
print(name) #結果是‘唐兒’

  特別要注意,若是咱們在不一樣的模塊中引入同一個模塊,而且在某一個模塊中改變了被引入模塊中的全局變量,則其餘模塊看到的值也隨之改變,緣由是python的模塊只會引入一次,你們共享同一個名稱空間

tang.py
name=''

111.py
import tang
tang.name='糖糖'
#if __name__ == __main__: 此時,只有在111py文件爲執行文件時纔會改變值
  #tang.name='糖糖’
112.py import tang import 111 print(tang.name) #結果是‘糖糖’

113.py
import tang
import 111
#print(tang.name) #而此時,結果就不在是‘糖糖’,而是‘糖’

  咱們能夠對引入的模塊從新命名,還能夠一次性引入多個模塊

import tang as t
print(t.name)  #這樣也行的

import time,random,json,tang #一次引入多個,但引入的順序是有規定的

  正確的導入模塊的順序:

  1,全部的模塊導入都要寫在最上面,這是最基本的

  2,先引入內置模塊

  3,在引入擴展模塊

  4,最後引入自定義的模塊

三,from xxx import xxx

  其實就是選擇性的導入

tang.py
name='糖糖' def xihuan(): print('%s喜歡看小說'%name) print('她喜歡畫畫') print('她喜歡喝冰紅茶') print('她喜歡吃胡豆') xihuan()

from tang import xihuan
xihuan() #直接使用就能夠,不用tang.

  可是這有個坑,當咱們從一個模塊中引入一個變量的時候,若是當前文件中出現了重名的變量時,會覆蓋掉模塊中引入的那個變量

tang.py
name='糖糖' def xihuan(): print('%s喜歡看小說'%name) print('她喜歡畫畫') print('她喜歡喝冰紅茶') print('她喜歡吃胡豆') xihuan()

from tang import name
name='靜靜'
print(name) #此時結果是‘靜靜’

 因此,不要重名,切記,不要重名!不只僅是變量名不要重複,咱們建立的py文件的名字不要和系統內置的模塊重名,不然,引入的模塊都是python內置的模塊。

  還有一種特殊的寫法,from xxx import *,此時也是把模塊中的全部內容導入。注意:若是所導的模塊中沒有寫__all__則默認全部內容導入,但若是寫了__all__,此時導入的內容就是__all__列表中列出來的全部名字

tang.py
__all__=['name']
name='糖糖' def xihuan(): print('%s喜歡看小說'%name) print('她喜歡畫畫') print('她喜歡喝冰紅茶') print('她喜歡吃胡豆') www.pyfrom tang import *print(name) #結果是‘糖糖’xihuan() #報錯
相關文章
相關標籤/搜索