Python學習日記(十九) 模塊導入

来源:https://www.cnblogs.com/Fantac/archive/2019/09/02/11444478.html
-Advertisement-
Play Games

模塊導入 當文件夾中有這樣一個自定義的command模塊 在它的內部寫下下列代碼: 然後我們在command模塊中執行下列代碼: 我們如果在這段程式中反覆執行多次這一段代碼,這一個文件結果也只會被導入一次 調用command模塊中的方法fuc() 當我們寫這樣一個代碼的時候,電腦會先去找到這一個模 ...


模塊導入

當文件夾中有這樣一個自定義的command模塊

在它的內部寫下下列代碼:

print('這個py文件被調用!')
def fuc():
    print('這個函數被調用!')

然後我們在command模塊中執行下列代碼:

import command      #這個py文件被調用!

我們如果在這段程式中反覆執行多次這一段代碼,這一個文件結果也只會被導入一次

import command      #這個py文件被調用!
import command
import command
import command
import command
import command

調用command模塊中的方法fuc()

import command      #這個py文件被調用!
command.fuc()       #這個函數被調用!

當我們寫這樣一個代碼的時候,電腦會先去找到這一個模塊,找到之後再創建這個模塊的命名空間,把文件夾的名字都放在命名空間里

如果我們在temp_py.py中也寫一個fuc()函數:

import command      #這個py文件被調用!
def fuc():
    print('hello __fuc__')
command.fuc()       #這個函數被調用!

那麼實際上它調用的還是command模塊內的函數

如果在command模塊內和temp_py.py中加入相同的變數:

command模塊代碼:

print('這個py文件被調用!')
number = 150
def fuc():
    print('這個函數被調用!',number)    #number獲取到一個記憶體地址再從中拿到值

temp_py.py執行代碼:

import command      #這個py文件被調用!
number = 300
print(command.number)   #150
print(number)           #300

當你要導入一個模塊的時候,電腦會先到sys.modules()中去找你導入的這個模塊是否在這個裡面

import command      #這個py文件被調用!
import sys
print(sys.modules.keys())   #dict_keys(['sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', 'zipimport', '_frozen_importlib_external', '_io', 'marshal', 'nt', 'winreg', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 'abc', '_abc', 'site', 'os', 'stat', '_stat', 'ntpath', 'genericpath', 'os.path', '_collections_abc', '_sitebuiltins', '_bootlocale', '_locale', 'encodings.gbk', '_codecs_cn', '_multibytecodec', 'encodings.cp437', 'command'])

在最後我們可以看到之前的command模塊有被成功導入

如果我們要找的這個模塊在sys.modules()中找不到,那麼就依據sys.path()路徑去找到模塊,若找到就創建這個模塊的命名空間再把文件名陳放在記憶體里並執行,若找不到那麼就會報錯

給模塊取別名:

語法:import '模塊名' as '別名'

import command as comd  #這個py文件被調用!
comd.fuc()              #這個函數被調用! 150
import time as t
print(t.time())         #1567359703.0011516
print(time.time())      #NameError: name 'time' is not defined  

假設有兩個模塊xmlreader.py和csvreader.py,它們都定義了函數read_data(filename):用來從文件中讀取一些數據,但採用不同的輸入格式.可以編寫代碼來選擇性地挑選讀取模塊,例如

if file_format == 'xml':
     import xmlreader as reader
elif file_format == 'csv':
     import csvreader as reader
data=reader.read_date(filename)

一行獲取模塊:

import sys,os,pickle,shelve,json

不推薦這樣寫後期不好維護,建議一行一行寫在開頭,能夠讓人一目瞭然

模塊的寫法順序:

內置模塊(re、time等)、擴展的模塊(django等)、自定義的模塊

from...import...的用法

from time import time
print(time())   #1567360779.0056956
from sys import version
print(version)  #3.7.1 (default, Dec 10 2018, 22:54:23) [MSC v.1915 64 bit (AMD64)]

在pycharm中,如果是自定義模塊要用from...import...調用方法有紅色的波浪線報錯是因為pycharm主觀認為從根目錄去找這個模塊,結果卻找不到,但其實這個模塊可以從sys.path()中找到

若在temp_py.py定義一個和fuc同名的函數,讓我們來看看執行結果:

from command import fuc     #這個py文件被調用!
def fuc():
    print('!!!!!!!')        #!!!!!!!
fuc()

也支持獲取多個方法:

 

from 模塊名 import *

它能把模塊內的名字都調用

缺點:不安全怕重名

from time import *
sleep = 10
sleep(0.1)      #TypeError: 'int' object is not callable

__all__

只和from 模塊名 import *有關

如果有被__all__約束住那麼才能夠執行

__name__

當我們直接執行這個模塊的時候,這裡的__name__就等於'__main__'

__all__ = ['number','fuc']
print('這個py文件被調用!')
number = 150            #這裡的值已經放到了記憶體地址中
def fuc():
    print('這個函數被調用!',number)
def fuc2():
    print('fuc2')
def fuc3():
    print('fuc3')
print(__name__)        #__main__

當我們執行其他模塊的時候,在其他模塊中引用這個模塊,這個模塊中的__name__就等於'這個模塊的名字'

import command          #這個py文件被調用!
                        #command

有些時候當我們在其他模塊中調用模塊時,調用的這個模塊本身可能有一些測試的代碼,如果我們直接調用的話那麼這些測試的代碼也會跟著一起執行出來,但是實際上我們在調用這個模塊的時候並不想讓它裡面的內容直接就跑出來,所以我們就要在這個模塊中添加一個判斷來確定它的__name__

當在這個模塊執行時:

__all__ = ['number','fuc']
print('這個py文件被調用!')
number = 150            #這裡的值已經放到了記憶體地址中
def fuc():
    print('這個函數被調用!',number)
def fuc2():
    print('fuc2')
def fuc3():
    print('fuc3')
if __name__ == '__main__':
    print('執行下列調試代碼或其他功能代碼...')     #執行下列調試代碼或其他功能代碼...

在其他模塊調用這個模塊時,模塊中的那些調試代碼就不會再被直接執行了

import command      #這個py文件被調用!

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 身份互聯網和物聯網之間有什麼區別? 顧名思義,物聯網是關於物的——設備、控制器、致動器等等。但這些東西會執行任務、收集數據、連接到其他設備。換句話說, 每個設備都會有帶多重屬性的一個身份,而這些屬性必須得到良好的理解,才可以驅動好事發生,而阻止壞事降臨。 因此, 身份互聯網IOI (Internet ...
  • 盒子模型:(重點) 盒子模型(CSS框模型)規定了元素框處理元素內容、內邊距、邊框、外邊框等樣式 記住上面這一張圖!一定要記住!一定!一定! 內邊距、邊框和外邊距是可選參數屬性,預設值:0 ;很多元素由用戶代理樣式表設置外邊距和邊框,通過將元素的 margin外邊距和padding內邊距設置為 0 ...
  • jQuery介紹 在說jQuery之前,先說一個概念吧,什麼是JavaScript框架庫,其實就是一個普通的js文件,裡面封裝了很多函數或者說封裝了很多相容的代碼;當然啦,jQuery就是眾多庫的一員,那麼我們為什麼要學習jQuery呢,那就講一下他的特點; 1. 很好的解決了不同瀏覽器之間的相容性 ...
  • 1.判斷輸入值的長度 1.1 根據輸入值的類型不同,限制輸入值長度不同 此時需要使用自定義的校驗規則。 如長度要求:中文輸入5位,非中文10位 1 <FormItem label="名稱" {...formItemLayout}> 2 {getFieldDecorator('name', { 3 r ...
  • Node.js是一個基於 Chrome V8 引擎的 JavaScript 運行環境;Node.js使用一個事件驅動、非阻塞式 I/O 的模型,使其輕量且高效;Node.js的軟體包生態系統npm是全球最大的開源庫生態系統。本文詳細介紹了Node.js的安裝、配置及測試教程,希望對您有所幫助。 ...
  • 前言 Koa 應用程式是一個包含一組中間件函數的對象,它是按照類似堆棧的方式組織和執行的。 當一個中間件調用 next() 則該函數暫停並將控制傳遞給定義的下一個中間件。當在下游沒有更多的中間件執行後,堆棧將展開並且每個中間件恢復執行其上游行為。 以上兩句話,是我在官方文檔中找到其對 Koa 中間件 ...
  • 下載:curl -L https://get.daocloud.io/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose 許可權:chm ...
  • 根據這個問題和答案 - Python multiprocessing.cpu_count()在4核Nvidia Jetson TK1上返回'1' - Python multiprocessing.cpu_count()在某些系統上的功能輸出反映了主動使用的CPU數量,而不是CPU的數量實際上可以通過 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...