python模塊簡介


python模塊:

  python中的模塊是什么?簡而言之,在python中,一個文件(以“.py”為后綴名的文件)就叫做一個模塊,每一個模塊在python里都被看做是一個獨立的文件。模塊讓你能夠有邏輯地組織你的 Python 代碼段。把相關的代碼分配到一個模塊里能讓你的代碼更好用,更易懂。模塊能定義函數,類和變量,模塊里也能包含可執行的代碼。一個模塊編寫完畢之后,其他模塊直接調用,不用再從零開始寫代碼了,節約了工作時間;避免函數名稱和變量名稱重復,在不同的模塊中可以存在相同名字的函數名和變量名,但是,切記,不要和系統內置的模塊名稱重復。

模塊的三種來源:

1.內置的(python解釋器自帶)

2.第三方的(別人寫的)

3.自定義的(我們自己寫的)

模塊的四種表現形式:

1.使用python編寫的py文件(也就意味着py文件也可以稱之為模塊:一個py文件也可以稱之為一個模塊)

2.已被編譯為共享庫或DLL的C或C++擴展(了解)

3.把一系列模塊組織到一起的文件夾(文件夾下有一個__init__.py文件,該文件夾稱之為包)包:一系列py文件的結合體

4.使用C編寫並連接到python解釋器的內置模塊

為什么要用模塊:

1.用別人寫好的模塊(內置的,第三方的):典型的拿來主義,極大的提高開發效率

2.使用自己寫的模塊(自定義的):當程序比較龐大的時候,你的項目不可能只在一個py中那么當多個文件中都需要使用相同的方法的時候 可以將該公共的方法寫到一個py文件中其他的文件以模塊的形式導過去直接調用即可

在我們使用模塊的時候一定要區分哪個是執行文件,哪個是被導入文件。

#我們先自定義一個模塊 名為mod.py;

print("hello world")
name = "fan"
def func1():
    print("fan1")
def func2():
    print("fan2")
    func()

#然后我們使用里一個py文件進行導入這個模塊;
import mod
import mod
import mod

#打印輸出:

hello world

#可以發現只打印了一次,是因為每次導入模塊時,解釋器都回去檢查一下這個模塊有沒有之前被導過,多次導入不會再執行模塊文件。

""" 模塊導入的過程:
1.找到這個需導入的模塊;
2.判斷這個模塊是否被導入過;
如果沒有被導入過:
    創建一個屬於這個模塊的命名空間;如果用戶沒有定義變量來引用這個模塊的內存地址的話,
那么就使用模塊的名稱來引用這個模塊的內存地址;如果用戶使用as來指定變量接受這個內存地址的話,
那么就將內存地址賦值給這個變量;且下文在調用時只能使用這個變量進行調用不能再使用模塊名進行調用了,然后執行這個模塊中的代碼。
如果該模塊已經被導入過:
  那么解釋器不會重新執行模塊內的語句,后續的import語句僅僅是對已經加載到內存中的模塊的對象
關於導入的模塊與當前空間的關系:
    帶入的模塊會重新開辟一塊獨立的名稱空間,定義在這個模塊中的函數把這個模塊的命名空間當做全局命名空間,
這樣的話當前的空間就和模塊運行的空間分隔了,誰也不影響誰; 為模塊起別名: 模塊在導入的時候開辟了新空間內存,默認是使用模塊的名稱來引用這個內存地址的,有時候模塊的名稱很長再加上執行調用里面的功能的時候,
就顯的很不方便,為了更好的使用模塊,我們可以給模塊起別名;也就是在導入模塊的時候我們不讓它使用默認的名字來引用內存地址,
而是由我們自己定義的變量來引用這個模塊的內存地址; 方法:import mdddddddddd as md 這樣的話就表示使用變量md來引用這個內存地址,然后我們在文中再使用這個模塊的時候,只要使用md來調用這個模塊里的功能即可。
"""

 

from...import和import:

from...import跟import不同的是import會讀取整個模塊,所以impot必須進行定義后才能讀取它的變量名,而from...import訪問模塊中的名字不需要加模塊名前綴,它直接拿到指向模名稱空間中某個值的名字進行訪問的,但是from...import在訪問模塊中的名字可能會與當前執行文件中的名字沖突。例如:

# import datetime是引入整個datetime模塊,如果使用datetime模塊中的datetime類,
需要加上模塊名的限定。
import datetime print datetime.datetime.now() # 如果不加模塊名限定會出現錯誤:TypeError: 'module' object is not callable \
AttributeError: 'module' object has no attribute 'now'
# from datetime import datetime是只引入datetime模塊里的datetime類,
在使用時無需添加模塊名的限定。
from datetime import datetime print datetime.now()

 

模塊的查找順序是:先從內存中找,內存中沒的話會去內置中找,內置中找不到的話會去sys.path中找(環境變量)

if __name__ == '__main__':

只要我們創建了一個模塊(一個.py文件),這個模塊就有一個內置屬性name生成,該模塊的 name 的值取決於如何應用這個模塊。簡單的說就是,如果我們直接運行該模塊,那么__name__ == "__main__";如果你 import 一個模塊,那么模塊name 的值通常為模塊文件名。

如,創建一個test1.py:模塊中,首先定義了函數func(),用來打印出hello, world!
然后判斷__name__ 是否等於 __main__,如果等於,就打印。 def func(): print('hello, world!') if __name__ == "__main__": func() # 輸出結果為: hello, world! # 說明__name__ 等於 __main__ # 當文件被當做執行文件執行的時候__name__打印的結果是__main__ # 當文件被當做模塊導入的時候__name__打印的結果是模塊名(沒有后綴)

 

模塊的絕對導入和相對導入:

絕對導入的格式為 import A.B 或 from A import B,相對導入格式為 from . import B 或 from ..A import B,.代表當前模塊,..代表上層模塊,...代表上上層模塊,依次類推。

相對導入可以避免硬編碼帶來的維護問題,例如我們改了某一頂層包的名,那么其子包所有的導入就都不能用了。但是存在相對導入語句的模塊,不能直接運行,否則會有異常:

如果是絕對導入,一個模塊只能導入自身的子模塊或和它的頂層模塊同級別的模塊及其子模,

如果是相對導入,一個模塊必須有包結構且只能導入它的頂層模塊內部的模塊所以,如果一個模塊被直接運行,則它自己為頂層模塊,不存在層次結構,所以找不到其他的相對路徑,所以如果直接運行python xx.py ,而xx.py有相對導入就會報錯

#  絕對導入
import sys, os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

#  相對導入:

import sys, os
from . import models
from ..proj import settings

"""
絕對導入必須依據執行文件所在的文件夾路徑為准
絕對導入無論在執行文件中還是被導入文件都適用
 相對導入
    .代表的當前路徑
    ..代表的上一級路徑
    ...代表的是上上一級路徑

    相對導入不能再執行文件中使用
    相對導入只能在被導入的模塊中使用,使用相對導入 就不需要考慮
    執行文件到底是誰 只需要知道模塊與模塊之間路徑關系
"""

 

軟件開發目錄規范:

1.首先是項目名:
2.bin 文件夾:
  start.py  啟動文件
3.conf 文件夾:
  settings.py  項目配置文件
4.core 文件夾:
  src.py  項目核心邏輯
5.db 文件夾:
  數據庫相關文件
6.lib 文件夾:
  common.py   項目所用到的公共功能
7.log 文件夾:
  log.log   項目的日志文件
8.Readme:
   文本文件:項目簡介
 
  
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM