python代碼模板_python 代碼模板

python中的Module是比較重要的概念。常見的情況是,事先寫好一個.py文 件,在另一個文件中需要import時,將事先寫好的.py文件拷貝 到當前目錄,或者是在sys.path中增加事先寫好的.py文件所在的目錄,然后import。這樣的做法,對于少數文件是可行的,但如果程序數目很 多,層級很復雜,就很吃力了。

有沒有辦法,像Java的Package一樣,將多個.py文件組織起來,以便在外部統一調用,和在內部互相調用呢?答案是有的。

主要是用到python的包的概念,python __init__.py在包里起一個比較重要的作用

要弄明白這個問題,首先要知道,python在執行import語句時,到底進行了什么操作,按照python的文檔,它執行了如下操作:

第1步,創建一個新的,空的module對象(它可能包含多個module);

第2步,把這個module對象插入sys.module中

第3步,裝載module的代碼(如果需要,首先必須編譯)

第4步,執行新的module中對應的代碼。

在執行第3步時,首先要找到module程序所在的位置,其原理為:

如 果需要導入的module的名字是m1,則解釋器必須找到m1.py,它首先在當前目錄查找,然后是在環境變量PYTHONPATH中查找。 PYTHONPATH可以視為系統的PATH變量一類的東西,其中包含若干個目錄。如果PYTHONPATH沒有設定,或者找不到m1.py,則繼續搜索 與python的安裝設置相關的默認路徑,在Unix下,通常是/usr/local/lib/python。

事實上,搜索的順序是:當前路徑 (以及從當前目錄指定的sys.path),然后是PYTHONPATH,然后是python的安裝設置相關的默認路徑。正因為存在這樣的順序,如果當前 路徑或PYTHONPATH中存在與標準module同樣的module,則會覆蓋標準module。也就是說,如果當前目錄下存在xml.py,那么執 行import xml時,導入的是當前目錄下的module,而不是系統標準的xml。

了解了這些,我們就可以先構建一個package,以普通module的方式導入,就可以直接訪問此package中的各個module了。

Python中的package定義很簡單,其層次結構與程序所在目錄的層次結構相同,這一點與Java類似,唯一不同的地方在于,python中的package必須包含一個__init__.py的文件。

例如,我們可以這樣組織一個package:

package1/

__init__.py

subPack1/

__init__.py

module_11.py

module_12.py

module_13.py

subPack2/

__init__.py

module_21.py

module_22.py

……

__init__.py可以為空,只要它存在,就表明此目錄應被作為一個package處理。當然,__init__.py中也可以設置相應的內容,下文詳細介紹。

好了,現在我們在module_11.py中定義一個函數:

def funA():

print "funcA in module_11"

return

在頂層目錄(也就是package1所在的目錄,當然也參考上面的介紹,將package1放在解釋器能夠搜索到的地方)運行python:

>>>from package1.subPack1.module_11 import funcA

>>>funcA()

funcA in module_11

這樣,我們就按照package的層次關系,正確調用了module_11中的函數。

細心的用戶會發現,有時在import語句中會出現通配符*,導入某個module中的所有元素,這是怎么實現的呢?

答案就在__init__.py中。我們在subPack1的__init__.py文件中寫

__all__ = ['module_13', 'module_12']

然后進入python

>>>from package1.subPack1 import *

>>>module_11.funcA()

Traceback (most recent call last):

File "", line 1, in

ImportError: No module named module_11

也就是說,以*導入時,package內的module是受__init__.py限制的。

好了,最后來看看,如何在package內部互相調用。

如果希望調用同一個package中的module,則直接import即可。也就是說,在module_12.py中,可以直接使用

import module_11

如果不在同一個package中,例如我們希望在module_21.py中調用module_11.py中的FuncA,則應該這樣:

from module_11包名.module_11 import funcA

包機制

# a.py

def?add_func(a,b):

return?a+b

#?b.py

from?a?import?add_func?#?Also?can?be?:?import?a

print?("Import?add_func?from?module?a")

print?("Result?of?1?plus?2?is:?")

print?(add_func(1,2))????#?If?using?"import?a"?,?then?here?should?be?"a.add_func"

module可以定義在包里面.Python定義包的方式稍微有點古怪,假設我們有一個parent文件夾,該文件夾有一個child子文件夾.child中有一個module a.py . 如何讓Python知道這個文件層次結構?很簡單,每個目錄都放一個名為_init_.py 的文件.該文件內容可以為空.這個層次結構如下所示:

parent

--__init_.py

--child

--?__init_.py

--a.py

b.py

那么Python如何找到我們定義的module?在標準包sys中,path屬性記錄了Python的包路徑.你可以將之打印出來:

import?sys

print(sys.path)

通常我們可以將module的包路徑放到環境變量PYTHONPATH中,該環境變量會自動添加到sys.path屬性.另一種方便的方法是編程中直接指定我們的module路徑到sys.path 中:

import?sys

import?os

sys.path.append(os.getcwd()+'\\parent\\child')

print(sys.path)

from?a?import?add_func

print?(sys.path)

print?("Import?add_func?from?module?a")

print?("Result?of?1?plus?2?is:?")

print?(add_func(1,2))

知識點:

如何定義模塊和包

如何將模塊路徑添加到系統路徑,以便python找到它們

如何得到當前路徑

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374123.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374123.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374123.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java并發教程–重入鎖

Java的synced關鍵字是一個很棒的工具–它使我們能夠以一種簡單可靠的方式來同步對關鍵部分的訪問,而且也不難理解。 但是有時我們需要對同步進行更多控制。 我們要么需要分別控制訪問類型(讀取和寫入),要么使用起來很麻煩&#xf…

找出互聯網類似以下圖的實例

轉載于:https://www.cnblogs.com/sghcjy/p/4978851.html

python比較運算符重載_python運算符重載

1、打印操作會首先嘗試__str__和str內置函數,他通常返回一個用戶友好顯示。__repr__用于所有其他環境,用于交互式模式下提示回應以及repr函數,如果沒有使用__str__,則會使用print和str。它通常返回一個編碼字符串,可以…

使用Spring MVC開發Restful Web服務

REST簡介 摘自Wikipedia: REST風格的體系結構由客戶端和服務器組成。 客戶端向服務器發起請求; 服務器處理請求并返回適當的響應。 請求和響應圍繞資源表示的傳遞而構建。 資源本質上可以是可以解決的任何連貫且有意義的概念。 正如您所閱讀的&#xff0…

深入Java核心 Java內存分配原理精講

深入Java核心 Java內存分配原理精講 Java內存分配與管理是Java的核心技術之一,之前我們曾介紹過Java的內存管理與內存泄露以及Java垃圾回收方面的知識,今天我們再次深入Java核心,詳細介紹一下Java在內存分配方面的知識。一般Java在內存分配時…

iOS正則表達式(親測,持續更新)

先來說說判斷方法,書寫不簡介但是好理解: -(BOOL)isRealNmaeString:(NSString *)str{NSString *pattern "填寫正則表達式";NSPredicate *pred [NSPredicate predicateWithFormat:"SELF MATCHES %", pattern];BOOL isMatch [pred evaluateWithObject:str…

python新建一個文件夾需要重新安裝模塊嗎_解決pycharm每次新建項目都要重新安裝一些第三方庫的問題...

目前有三個解決辦法,也是親測有用的:第一個方法:因為之前有通過pycharm的project interpreter里的號添加過一些庫,但添加的庫只是指定的項目用的,如果想要用,就必須用之前的項目的python解釋器,…

端到端測試的濫用–測試技術2

我的上一個博客是有關測試代碼方法的一系列博客中的第一篇,概述了使用一種非常常見的模式從數據庫檢索地址的簡單方案: …并描述了一種非常通用的測試技術: 不編寫測試 , 而是手動進行所有操作。 今天的博客涵蓋了另一種實踐&…

[AlwaysOn Availability Groups]排查:AG超過RPO

[AlwaysOn Availability Groups]排查:AG超過RPO 排查:AG超過RPO 在異步提交的secondary上執行了切換,你可能會發現數據的丟失大于RPO,或者在計算可以忍受的數據都是超過了RPO。 1.通常原因 1.網絡延遲太高,網絡吞吐量太…

那些年困擾我們的Linux 的蠕蟲、病毒和木馬

雖然針對Linux的惡意軟件并不像針對Windows乃至OS X那樣普遍,但是近些年來,Linux面臨的安全威脅卻變得越來越多、越來越嚴重。個中原因包括,手機爆炸性的普及意味著基于Linux的安卓成為惡意黑 客最具吸引力的目標之一,以及使用Lin…

python單元測試框架unittest介紹和使用_Python+Selenium框架設計篇之-簡單介紹unittest單元測試框架...

前面文章已經簡單介紹了一些關于自動化測試框架的介紹,知道了什么是自動化測試框架,主要有哪些特點,基本組成部分等。在繼續介紹框架設計之前,我們先來學習一個工具,叫unittest。unittest是一個單元測試框架&#xff0…

使用PowerMock模擬靜態方法

在最近的博客中,我試圖強調使用依賴注入的好處,并表達一種想法,即這種技術的主要好處之一是,通過在類之間提供高度的隔離,它可以使您更輕松地測試代碼,并且得出的結論是,許多好的測試等于好的代…

多態之向上轉型

//向上轉型,子類引用指向父類對象 public class UpcastingDemo{ public static void main(String[] args){ Employee enew Employee(); System.out.println(e.grade); e.job(); e.run(); System.out.println("\n"); Manager mnew Manager(…

(轉)FPGA異步時序和多時鐘模塊

http://bbs.ednchina.com/BLOG_ARTICLE_3019907.HTM 第六章 時鐘域 有一個有趣的現象,眾多數字設計特別是與FPGA設計相關的教科書都特別強調整個設計最好采用唯一的時鐘域。換句話說,只有一個獨立的網絡可以驅動一個設計中所有觸發器的時鐘端口。雖然…

穆里尼奧:與范加爾風格不同,轉變需要時間

據英媒報道,曼聯主帥穆里尼奧近日向媒體表示自己很難繼續遵循前任主帥范加爾的理念去建立球隊,因為他們兩人有著完全不同的想法。 穆里尼奧近日在接受BT Sport的采訪時表示:“這份工作對于我來說最難的地方便是我與范加爾是非常不同的教練&am…

怎么檢測不到我的音頻_Linux 上的最佳音頻編輯工具推薦 | Linux 中國

在 Linux 上,有很多種音頻編輯器可供你選用。不論你是一個專業的音樂制作人,還是只想學學怎么做出超棒的音樂的愛好者,這些強大的音頻編輯器都是很有用的工具。-- Ankush Das(作者)在 Linux 上,有很多種音頻編輯器可供你選用。不論…

具有GlassFish和一致性的高性能JPA –第3部分

在我的四部分系列的第三部分中,我將解釋將Coherence與EclipseLink和GlassFish結合使用的第二種策略。 這就是通過EclipseLink使用Coherence作為二級緩存(L2)的全部內容。 一般的做法 這種方法將Coherence數據網格應用于依賴于無法完全預加載到…

接口使用時注意

interface Service{ void doSome(); //方法的默認修飾符為public abstract } public class InterfaceNote implements Service{ //方法默認的修飾符為 default void doSome(){ System.out.println("做一些服務!"); } public static void main(String…

【Hexo】deploy出錯的解決方法

1、ERROR Deployer not found: git 執行npm install hexo-deployer-git --save 2、$ hexo d INFO Deploying: git INFO Clearing .deploy_git folder... INFO Copying files from public folder... fatal: Not a git repository (or any of the parent directories): .git F…

精選30道Java筆試題解答(轉)

都是一些非常非常基礎的題,是我最近參加各大IT公司筆試后靠記憶記下來的,經過整理獻給與我一樣參加各大IT校園招聘的同學們,純考Java基礎功底, 老手們就不用進來了,免得笑話我們這些未出校門的孩紙們,但是I…