if __name__== "__main__" 的意思(作用)python代碼復用

来源:http://www.cnblogs.com/yelin/archive/2017/01/04/6250283.html
-Advertisement-
Play Games

if __name__== "__main__" 的意思(作用)python代碼復用 轉自:大步's Blog http://www.dabu.info/if-__-namelxx_-main__-mean-function-python-code-reuse.html 有人在學習python腳本時 ...


if __name__== "__main__" 的意思(作用)python代碼復用

轉自:大步's Blog   http://www.dabu.info/if-__-name__-__main__-mean-function-python-code-reuse.html

 

 

有人在學習python腳本時會發現有的腳本下麵有幾行代碼;

 
1 2 if __name__== "__main__": main()

不明白其中的意思,其實這就是方便我們代碼復用的,我們可以在其他腳本方便的調用另外一個腳本裡面的函數。

假設下載我有下麵一個python代碼,叫做: pysysinfo.py


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/usr/bin/env python #A system information gathering script import subprocess   #command 1          //這段代碼是查詢系統信息的 uname = "uname"         uname_arg = "-a" print "gathering system information with $s command:\n" % uname subprocess.call([uname,uname_arg])   #command 2       //這段代碼是查詢磁碟分區使用情況的 diskspace = "df" diskspace_arg = "-h" print "gathering diskspace information %s command:\n"  %  diskspace subprocess.call([diskspace,diskspace_arg])

但是如果我們只想用其中第一段command 1的代碼查詢系統信息,怎麼辦呢?難道把這個腳本的後面command 2代碼刪除?that is foolish!!還有一個好的方法就是可以去將上面的代碼功能封裝成模塊,然後通過模塊調用其中的函數,方便我們多次調用,而又不需要重新改寫代碼。下麵是將上面的代碼封裝好,函數化,放到模塊中的改進腳本:

 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/usr/bin/env python #A system information gathering script import subprocess   #command 1 def uname_func() uname = "uname" uname_arg = "-a" print "gathering system information with $s command:\n" % uname subprocess.call([uname,uname_arg])   #command 2 def disk_func() diskspace = "df" diskspace_arg = "-h" print "gathering diskspace information %s command:\n"  %  diskspace subprocess.call([diskspace,diskspace_arg])   #main function that call other functions def main() uname_fun() diskspace_fun()   main()

問題是當我們要調用其中的函數的時候,如何讓腳本知道是我們到底是想讓它直接運行還是只是作為模塊引入另外一個腳本呢?.py有兩種使用方式,一種是作為模塊被調用,另外一種是直接運行。那麼如何判斷呢?於是就有了以下改進!!!

 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #!/usr/bin/env python #A system information gathering script import subprocess   #command 1 def uname_func() uname = "uname" uname_arg = "-a" print "gathering system information with $s command:\n" % uname subprocess.call([uname,uname_arg])   #command 2 def disk_func() diskspace = "df" diskspace_arg = "-h" print "gathering diskspace information %s command:\n"  %  diskspace subprocess.call([diskspace,diskspace_arg])   #main function that call other functions def main() uname_fun() diskspace_fun()   if __name__== "__main__": main()

在main()函數前加入了一個判斷語句,以此來讓腳本判斷自己是被當做模塊調用,還是被直接運行的。當被import作為模塊調用的時候,if以下的代碼就不會被執行,也就是說main()函數不會被執行。

為了更好說明,引用下麵一篇文章來讓我們更加明白

python中if __name__ == '__main__': 的解析

模塊是對象,並且所有的模塊都有一個內置屬性 __name__。一個模塊的 __name__ 的值取決於您如何應用模塊。如果 import 一個模塊,那麼模塊__name__ 的值通常為模塊文件名,不帶路徑或者文件擴展名。但是您也可以像一個標準的程式樣直接運行模塊,在這 種情況下, __name__ 的值將是一個特別預設"__main__"。

///////////////////////////////////////////////////////////////////////////////////////////////////

在cmd 中直接運行.py文件,則__name__的值是'__main__';

而在import 一個.py文件後,__name__的值就不是'__main__'了;

從而用if __name__ == '__main__'來判斷是否是在直接運行該.py文件

如:

#Test.py

class Test:

def __init(self):pass

def f(self):print 'Hello, World!'

if __name__ == '__main__':

Test().f()

#End

你在cmd中輸入:

C:>python Test.py

Hello, World!

說明:"__name__ == '__main__'"是成立的

你再在cmd中輸入:

C:>python

>>>import Test

>>>Test.__name__                #Test模塊的__name__

'Test'

>>>__name__                       #當前程式的__name__

'__main__'

無論怎樣,Test.py中的"__name__ == '__main__'"都不會成立的!

所以,下一行代碼永遠不會運行到!

 

通過這篇文章,我們知道,.py文件會根據自身的使用方式,它的__name__的屬性會不同。如果他的屬性是“__main__”,那麼腳本就知道自己是被直接執行的。如果是被別的文件import的來用,__name__的屬性就會是腳本自己的文件名,從而防止錯誤的執行。引入的if語句的作用就是  通過檢查該模塊的__name__屬性來實現判斷.py文件被使用的方式。從而方便我們代碼復用,也可以測試模塊。


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

-Advertisement-
Play Games
更多相關文章
  • C# 基礎回顧 - 匿名方法 目錄 簡介 匿名方法的參數使用範圍 委托示例 簡介 在 C# 2.0 之前的版本中,我們創建委托的唯一形式 -- 命名方法。 而 C# 2.0 -- 引進了匿名方法,在 ≥ C# 3.0 的版本中,我們會用 Lambda 表達式進行取代匿名方法,並且用 Lambda 表 ...
  • 在《ASP.NET Core應用的錯誤處理[1]:三種呈現錯誤頁面的方式》中,我們通過幾個簡單的實例演示瞭如何呈現一個錯誤頁面,這些錯誤頁面的呈現分別由三個對應的中間件來完成,接下來我們將對這三個中間件進行詳細介紹。在開發環境呈現的異常頁面是通過一個類型為DeveloperExceptionPage... ...
  • 2009 年我讀了李笑來老師的《把時間當朋友》,知識了柳比歇夫的時間記錄法。當時激動壞了,馬上動手實踐起來。一開始的時候,是用一個小本子,走到哪兒都帶著。完成一件事,就記錄一下花費的時間。這樣的做法持續了一周多的時間,我發現每天浪費在 Google Reader 上的時間大幅度減少了。那個時候,我使 ...
  • 什麼是Servlet?① Servlet就是JAVA 類② Servlet是一個繼承HttpServlet類的類③ 這個在伺服器端運行,用以處理客戶端的請求 Servlet相關包的介紹--javax.servlet.* :存放與HTTP 協議無關的一般性Servlet 類;--javax.servl ...
  • 直接插入排序是將一個記錄插入到已經排好序的有序表中,從而得到一個新的記錄數加1的有序表。 下麵的代碼中會先假設數組的第一個元素是已經拍好序的有序表,然後從第二個元素開始遍歷剩下的元素。 所以呢,第一個for迴圈是遍歷待插入的元素,第二個for迴圈是遍歷被插入的有序表,並將待插入元素與有序表的元素比較 ...
  • 參考 http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html 問題:bash怎麼提取字元串的最後一位?例如python中string[-1]就是python字元串最後一位。 echo ${PATH:((${#PATH} - 1)) ...
  • RSA.h #ifndef _RSA_H #define _RSA_H #include #include #include /* 密鑰產生: 1.隨機選定兩個大素數p, q. 2.計算公鑰和私鑰的公共模數 n = pq . 3.計算模數n的歐拉函數 φ(n) . 4.選定一個正整數e, 使1 e,... ...
  • SHA-1.cpp TEST.cpp ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...