1. 程式人生 > >python3匯入自定義模組

python3匯入自定義模組

1、模組概念

在Python中,一個.py檔案就稱之為一個模組(Module)。使用模組組織程式碼,最大的好處是大大提高了程式碼的可維護性

模組一共三種:python標準庫、第三方模組、應用程式自定義模組。

相同名字的函式和變數完全可以分別存在不同的模組中,因此,我們自己在編寫模組時,不必考慮名字會與其他模組衝突。但是也要注意,儘量不要與內建函式名字衝突。

使用模組的好處:最大的好處是大大提高了程式碼的可維護性。其次,編寫程式碼不必從零開始。當一個模組編寫完畢,就可以被其他地方引用。我們在編寫程式的時候,也經常引用其他模組,包括Python內建的模組和來自第三方的模組。

2、模組匯入

import語句

1 import module1[, module2[,... moduleN]

import一個模組的實質就是把這個python檔案從頭到尾執行一遍

import模組的查詢模組的順序如下:
1、先從當前目錄下找
2、當前目錄下找不到的話,在從sys.path的路徑找
從上面兩個目錄都找不到,那就報錯(當然,可以使用sys.path.append()把一個臨時目錄加進去,那麼也可以查到到路徑,但是第二次的時候就不能用了)

每次import的時候,都會相應的開闢記憶體空間存放被import的內容,但是與呼叫import的檔案開闢的記憶體空間相互獨立。例如import foo.py在新建的名稱空間裡執行原始檔(foo.py)程式碼時,所有對全域性名稱空間的引用或修改,都是以foo.py為準。

注意:

一個模組可以在當前位置import多次,但是隻有第一次匯入會執行內容,其他的都為引用記憶體

更改呼叫名稱:將logging更改為log

1 import logging as log
2 log.critical("www")

from...import語句

1 from modname import name1[, name2[, ... nameN]]

這個宣告不會把整個modulename模組匯入到當前的名稱空間中,只會將它裡面的name1或name2單個引入到執行這個宣告的模組的全域性符號表。

例如:有moudel_name.py

#
-*- coding:utf-8 -*- print("This is module_name.py") name = 'Hello' def hello(): print("Hello")

module_test04.py

# -*- coding:utf-8 -*-
import module_name 

def a():
    module_name.hello()
    print("fun a")

def b():
    module_name.hello()
    print("fun b")

a()
b()

多個函式需要重複呼叫同一個模組的同一個方法,每次呼叫需要重複查詢模組。所以可以做以下優化:

module_test05.py

# -*- coding:utf-8 -*-
from module_name import hello 

def a():
    hello()
    print("fun a")

def b():
    hello()
    print("fun b")

a()
b()

執行結果都是

執行結果:
E:\PythonImport>python module_test04.py
This is module_name.py
Hello
fun a
Hello
fun b

可以使用"from module_name import hello"進行優化,減少了查詢的過程。

包的呼叫

為了避免模組名衝突,Python又引入了按目錄來組織模組的方法,稱為包(Package)。

每一個包目錄下面都會有一個__init__.py的檔案,這個檔案是必須存在的,否則,Python就把這個目錄當成普通目錄(資料夾),而不是一個包。__init__.py可以是空檔案,也可以有Python程式碼,因為__init__.py本身就是一個模組,而它的模組名就是對應包的名字。呼叫包就是執行包下的__init__.py檔案。

跨包呼叫(當前目錄下有modulepack1包):

1 from modulepack1[.modulepack2] import module

如果當前目錄下能夠找到要呼叫的包,可以直接from包import模組,如果當前目錄找不到要呼叫的包,需要向sys.path新增包的所在絕對路徑。

import一個包名,就等於執行了這個包下的__init__檔案。

示例:

在nod1裡import  hello是找不到的,需要手動新增包路徑,如果找到那是因為pycharm給加了不必要的路徑,以命令列執行為準。

import sys,os
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  #__file__獲取執行檔案相對路徑,整行為取上一級的上一級目錄
sys.path.append(BASE_DIR)  #新增路徑,這個是臨時的
import hello
hello.hello1()

將包設定為程式程式碼的根目錄

模組呼叫測試

1 if __name__=='__main__':  #__name__方法判斷
2     print('ok')

在一個py模組直接執行print(__name__)會輸出__main__,表示當前這個檔案屬於執行檔案,如果從其他的py模組中匯入一個py模組,執行被匯入的py模組中的print(__name__)會輸出被匯入的模組的模組名稱,那麼if判斷就不會成功,所以匯入的時候不會執行判斷內的程式碼。

主要用在除錯功能,即一個模組被呼叫的時候不執行內容,而自己除錯模組的時候可以順利的執行模組內容。

內建函式

可以通過 "print(dir(__builtins__))" 檢視Python中的內建函式

非內建函式需要使用"import"匯入。Python中的模組檔案在"安裝路徑\Python\Python35\Lib"目錄下。