Python 炫技操作:模塊重載的五種方法

2021-02-20 Python編程
環境準備

新建一個 foo 文件夾,其下包含一個 bar.py 文件

$ tree foo
foo
└── bar.py

0 directories, 1 file

bar.py 的內容非常簡單,只寫了個 print 語句

print("successful to be imported")

只要 bar.py 被導入一次,就被執行一次 print

禁止重複導入

由於有 sys.modules 的存在,當你導入一個已導入的模塊時,實際上是沒有效果的。

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>

重載模塊方法一

如果你使用的 python2(記得前面在 foo 文件夾下加一個 __init__.py),有一個 reload 的方法可以直接使用

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> reload(bar)
successful to be imported
<module 'foo.bar' from 'foo/bar.pyc'>

如果你使用的 python3 那方法就多了,詳細請看下面

重載模塊方法二

如果你使用 Python3.0 -> 3.3,那麼可以使用 imp.reload 方法

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> import imp
>>> imp.reload(bar)
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>

但是這個方法在 Python 3.4+,就不推薦使用了

<stdin>:1: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses

重載模塊方法三

如果你使用的 Python 3.4+,請使用 importlib.reload 方法

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> import importlib
>>> importlib.reload(bar)
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>

重載模塊方法四

如果你對包的加載器有所了解(詳細可以翻閱我以前寫的文章:https://iswbm.com/84.html)

還可以使用下面的方法

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> bar.__spec__.loader.load_module()
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>

重載模塊方法五

既然影響我們重複導入的是 sys.modules,那我們只要將已導入的包從其中移除是不是就好了呢?

>>> import foo.bar
successful to be imported
>>>
>>> import foo.bar
>>>
>>> import sys
>>> sys.modules['foo.bar']
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>
>>> del sys.modules['foo.bar']
>>>
>>> import foo.bar
successful to be imported

有沒有發現在前面的例子裡我使用的都是 from foo import bar,在這個例子裡,卻使用 import foo.bar,這是為什麼呢?

這是因為如果你使用 from foo import bar 這種方式,想使用移除 sys.modules 來重載模塊這種方法是失效的。

這應該算是一個小坑,不知道的人,會掉入坑中爬不出來。

>>> import foo.bar
successful to be imported
>>>
>>> import foo.bar
>>>
>>> import sys
>>> del sys.modules['foo.bar']
>>> from foo import bar
>>>

相關焦點

  • Python 炫技操作:五種 Python 轉義表示法
    因此,當我定義一個字符串的值為 hello + 回車 + world 時,就有了多種方法:# 第一種方法:8進位>>> msg = "hello\012world">>> print(msg)helloworld>>> # 第二種方法:16 進位>
  • Python炫技操作:花式導包的八種方法
    直接 import 人盡皆知的方法,直接導入即可>>> import os>>> os.getcwd()'/home/wangbm'與此類似的還有,不再細講import ...import ... as ...from ... import ...
  • Python 炫技操作:條件語句的七種寫法
    本文我將寫一寫很簡單的條件判斷語句裡那些炫技操作,在這裡,如果你是 Python 發燒友,你可以學到一些寫出超酷的代碼書寫技巧,但學習歸學習,希望你區分場景使用。這是一段非常簡單的通過年齡判斷一個人是否成年的代碼,由於代碼行數過多,有些人就不太願意這樣寫,因為這體現不出自己多年的 Python 功力。
  • Python基礎模塊:日期與時間模塊@time+datetime
    終於,回家之後準備好好學習一下,從python基礎模塊開始,今天為大家準備的是python的日期與時間處理模塊time和datetime。目錄:1. time模塊1.1.常見方法1.2. struct_time對象的屬性1.3.
  • Python 進階必備:圖像庫 pillow
    模塊介紹pillow 庫提供了廣泛的文件格式支持、高效的內部表示和非常強大的圖像處理功能,包含了大約 25 個子模塊,其中的核心是 Image 模塊。Image 模塊是為了快速訪問以下幾種基本像素格式存儲的數據而設計的,為一般的圖像處理工具提供了一個堅實的基礎。下表是 pillow 庫中最常用的3個子模塊(圖像處理、編輯、截屏)和3個輔助模塊(過濾器、顏色、字體)。
  • python基礎學習教程:Python基礎語法
    讓我們嘗試另一種方式來執行 Python 腳本。以雙下劃線開頭的 __foo 代表類的私有成員,以雙下劃線開頭和結尾的 __foo__ 代表 Python 裡特殊方法專用的標識,如 __init__() 代表類的構造函數。
  • Python學習:mac電腦安裝python教程
    與python2.7 共存2 下載安裝包進入官方安裝包下載頁面,https://www.python.org/downloads/mac-osx/找到合適的安裝包,基本上mac電腦都是64位的系統,因此選擇64位的安裝包進行下載
  • python黑知識:python本體
    講述python的實現本體,版本,構建時間,構建工具和構建參數python的實現有很多種,如果想研究一下它語言本身一些機制的實現,可能需要看原始碼,那麼,就需要找到相應的實現,分支和版本。目前使用的python實現,根據python實現存在有這幾種CPython, Stackless Python, MicroPython, CLPython, Cython, IronPython, Jython, Pyjs, PyPy, Numba, Shed Skin Nuitka ,可以說是讓人眼花繚亂。
  • 當街玩漂移炫技,噪音轟鳴刺耳!南寧這4個年輕仔被交警抓了
    近日,有南寧市民發現,在南寧市濱江路上有車輛聚集,並炫技駕駛,發出陣陣轟鳴聲。這不僅噪音擾民,還存在交通安全隱患。
  • Python詞雲:Windows安裝Wordcloud報錯解決辦法
    首先,先看清楚你的python版本,以及搞清楚你的python是基於32位系統還是64位系統。具體操作方法:1、 在左下角搜索windows搜索框裡輸入cmd,打開命令行窗口;2、 輸入python;3、 這裡可以看到python的版本是3.8.2,基於32位系統。
  • Python的數據可視化:對比7種工具包
    Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。
  • 最新煙價:三五冰炫細支
    三五冰炫細支是555香菸品牌旗下的產品,三五冰炫細支上市以來受到大批菸民歡迎,其爆珠口感清涼,抽起來十分帶感。今天小編為大家介紹一下三五冰炫細支煙的價格表。三五冰炫細支怎麼樣?下面我們一起看看他的口感分析。
  • 來自16 歲高中生的暴擊: Python3.9 的「新特性必知圖」火了
    合併 (|) 與更新 (|=) 運算符已被加入內置的 dict 類,擴充了現有的 dict.update 和 {**d1, **d2} 字典合併方法。在Prasoon提供的圖中也展示了對應的示例,如下圖所示:
  • 「那時我玩直排輪四五年,正是炫技的時候……」
    「那時我玩直排輪四五年,正是炫技的時候。希望被人注意到,希望讓人家對你有印象,想聽到很多掌聲和歡呼聲。頭腦一熱,就會冒險做一些能力之上的事情。受傷最嚴重的一次,是在一個商場表演,現場有很多觀眾。
  • 「中技集團付融寶詐騙案」末日啟示錄五
    「中技集團付融寶詐騙案」末日啟示錄五      明明在早期的偵查中就已經證實23.68億企業貸流入了中技集團帳戶
  • 春天減肥:五種方法騎自行車減肥
    如果挑選了適合自己的自行車,再加上用科學的方法騎車,一定讓你在上下班的途中得到最有效的鍛鍊。1、減脂騎車法:以中等速度騎車,一般要連續不間斷騎行40分鐘以上,同時要注意規律呼吸,對減脂很有效果。2、強度型騎車法:首先要求以自己的6成極限速度騎行五至七分鐘,其次是用心率表觀測自己的每分鐘脈搏,使其處於心肺功能訓練區間內,這樣可以達到鍛鍊心血管系統的效果。
  • Python生成一維碼,二維碼
    我們的生活已完全離不開一維碼和二維碼,本文會簡單的介紹如果通過python的方法來生成它們
  • 圖解髖關節脫位復位:八種方法
    髖關節脫位復位手法有15種之多,本期我們配圖來講解其中的八種手法。
  • 聚焦 | 代春桂:生技崗上的「女漢子」
    當時大家都認為女性不適合做生技員。好在當時生技課主管認為女員工也做好生技工作,便破格錄取代春桂。於是,代春桂成為生技課裡的一員。初入生技,重重困難。因為人員緊缺,才到生技課的代春桂就要跟著老員工一邊負責架設機臺,一邊學習機臺維護和異常處理。面對陌生的新環境、專業的知識需求和鋒利的機臺刀具,代春桂也只能硬著頭皮上。在老員工架設機臺的時候,代春桂便跟著他們學習如何操作和維護機臺。
  • 專家推薦五種方法,女生快看!
    世界上沒有醜女人只有懶女人網絡上變美的招數千萬樣但真真假假我們分辨不出來現在廣醫附屬中醫醫院同德圍分院婦科就為我們介紹幾個真實有效的日常養顏的方法讓大家從裡到外容光煥發醫學指導:廣醫附屬中醫醫院同德圍分院婦科  禹安琪