最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python實現(xiàn)創(chuàng)建模塊的方法詳解

 更新時間:2022年07月20日 16:01:51   作者:古明地覺  
導入一個模塊,我們一般都會使用?import?關鍵字,但有些場景下?import?難以滿足我們的需要。所以除了?import?之外還有很多其它導入模塊的方式,下面就來介紹一下

楔子

導入一個模塊,我們一般都會使用 import 關鍵字,但有些場景下 import 難以滿足我們的需要。所以除了 import 之外還有很多其它導入模塊的方式,下面就來介紹一下。

__import__

這是一個內(nèi)置函數(shù),解釋器在 import 的時候,實際上就執(zhí)行了這個函數(shù)。

#?import?os?等價于如下方式
os?=?__import__("os")
print(os)??#?<module?'os'?from?'C:\\python38\\lib\\os.py'>

#?但是這種方式不能多級導入
path?=?__import__("os.path")
print(path)??#?<module?'os'?from?'C:\\python38\\lib\\os.py'>
#?可以看到,導入的仍是?os,而不是 os.path

#?如果想導入子模塊,需要一個參數(shù)?fromlist
#?我們給它傳一個非空列表即可
path?=?__import__("os.path",?fromlist=[""])
print(path)??#?<module?'ntpath'?from?'C:\\python38\\lib\\ntpath.py'>

但是官方不建議使用這個函數(shù),因為它是專門給解釋器用的,我們可以使用一個模塊。

import?importlib

os?=?importlib.import_module("os")
print(os)??#?<module?'os'?from?'C:\\python38\\lib\\os.py'>

#?可以多級導入
path?=?importlib.import_module("os.path")
print(path)??#?<module?'ntpath'?from?'C:\\python38\\lib\\ntpath.py'>

所以當導入的模塊名以字符串的形式存在時,或者模塊名不符合規(guī)范時,就可以使用這種方式。

importlib.machinery

importlib.machinery 里面提供了三種 Loader,可以讓我們以打開文件的方式導入一個模塊。

from?importlib.machinery?import?(
????SourceFileLoader,??#?導入源文件
????SourcelessFileLoader,??#?導入 pyc?文件
????ExtensionFileLoader??#?導入擴展文件
)

#?參數(shù)一:給模塊起個名字
#?參數(shù)二:文件路徑
os?=?SourceFileLoader(
????"我是?os?模塊",
????r"C:\python38\lib\os.py"
).load_module()
print(os)
"""
<module?'我是?os?模塊'?from?'C:\\python38\\lib\\os.py'>
"""
print(os.path.join("video",?"overwatch",?"hanzo.mp4"))
"""
video\overwatch\hanzo.mp4
"""

#?我們看到結果一切正常,但有一點需要注意
#?如果是導入包的話,那么要導入包里面的?__init__.py?文件
pd?=?SourceFileLoader(
????"我是?pandas?模塊",
????r"C:\python38\lib\site-packages\pandas\__init__.py"
).load_module()
print(pd.DataFrame({"a":?[1,?2,?3],?"b":?[4,?5,?6]}))
"""
???a??b
0??1??4
1??2??5
2??3??6
"""

#?如果只寫到?pandas,那么會拋出?PermissionError
#?因為我們不能把目錄當成文件來讀取
#?至于?import?一個包,本質(zhì)上也是加載包內(nèi)部的?__init__.py?
#?但這里需要我們顯式地加上?__init__.py

同理加載 pyc 和 pyd 也是類似的,但需要注意的是,加載普通文件和 pyc 文件時,我們可以隨便起名字,也就是第一個參數(shù)任意。但對于 pyd 文件,第一個參數(shù)必須和 pyd 文件的名字保持一致。

通過 module 類創(chuàng)建模塊

Python 一切皆對象,模塊自然也不例外。既然是對象,那么必然就會有相應的類來實例化它。

import?os
import?hashlib
import?numpy

#?os.__class__?等價于?type(os)
print(os.__class__)??#?<class?'module'>
print(hashlib.__class__)??#?<class?'module'>
print(numpy.__class__)??#?<class?'module'>

在 Python 里面,我們一般會把單獨的可導入文件稱之為模塊,把包含多個模塊的目錄稱之為。通過模塊和包,我們可以對項目進行功能上的劃分,分門別類地進行組織。

但不管是模塊、還是包,它們都是 module 這個類的實例對象,打印結果也能說明這一點。所以從解釋器的角度來看的話,模塊和包區(qū)分的并沒有那么明顯,直接把包看做是包內(nèi)部的 __init__.py 即可。

既然模塊的類型是 class module,那么我們是不是也可以通過調(diào)用類型對象的方式創(chuàng)建呢?顯然是可以的,但是 module 這個類解釋器沒有暴露給我們,直接用的話會提示變量 module 未定義。所以只能先隨便導入一個模塊,然后通過 type 函數(shù)或者 __class__ 屬性獲取。

#?不過?types?模塊內(nèi)部已經(jīng)幫我們做好了
#?ModuleType?=?type(sys)
from?types?import?ModuleType

print(ModuleType)??#?<class?'module'>

#?類對象有了,下面就可以創(chuàng)建了
#?module?類接收兩個參數(shù)
#?參數(shù)一:模塊的名字,必須傳遞
#?參數(shù)二:模塊的 doc,不傳默認為 None
satori?=?ModuleType("古明地覺",?"模塊的名字是一個女孩,她來自地靈殿")
print(satori)??#?<module?'古明地覺'>
print(satori.__doc__)??#?模塊的名字是一個女孩,她來自地靈殿


#?但此時模塊里面是沒啥東西的,我們加一些屬性吧
#?操作模塊本質(zhì)上是在操作它的屬性字典
code?=?"""
age?=?16

def?foo():
????return?"^_^"
"""
#?執(zhí)行?code,結果會體現(xiàn)在?satori?的屬性字典中
exec(code,?satori.__dict__)
print(satori.age)??#?16
print(satori.foo())??#?^_^

需要注意的是里面 exec 函數(shù),它會把字符串當成代碼來執(zhí)行,所以這就要求字符串的來源必須是可靠的,我們能夠確保不會出現(xiàn)惡意內(nèi)容。而如果是用戶傳遞的字符串,那么絕不能用 exec 來執(zhí)行,當然 eval 也是同理。

然后是 exec 的第二個參數(shù),表示執(zhí)行時的名字空間,默認是全局名字空間。所以當不指定第二個參數(shù)時,exec(code) 相當于創(chuàng)建了兩個全局變量:age 和 foo。

code?=?"""
age?=?16

def?foo():
????return?"^_^"
"""

exec(code)
print(age)??#?16
print(foo())??#?^_^

但是我們在執(zhí)行的時候,將它換成了 satori.__dict__,所以結果相當于給模塊添加了兩個變量,或者說屬性。

將一個類的實例變成一個模塊

如果想將一個類的實例變成模塊,那么這個類應該繼承 ModuleType。

import?sys
from?types?import?ModuleType


class?A(ModuleType):

????def?__init__(self,?module_name):
????????super().__init__(module_name)

????def?__getattr__(self,?item):
????????return?f"不存在的屬性:?{item}"

????def?__setattr__(self,?key,?value):
????????self.__dict__[key]?=?value

????def?__str__(self):
????????return?f"<module?'{self.__name__}'?from?'我來自于虛無'>"


a?=?A("我是?A")
print(a)??#?<module?'我是?A'?from?'我來自于虛無'>
print(a.__name__)??#?我是?A
print(a.xx)??#?不存在的屬性:?xx
a.xx?=?"xx"
print(a.xx)??#?xx

#?加入到?sys.modules?中
sys.modules["嘿嘿"]?=?a
import?嘿嘿
print(嘿嘿.xx)??#?xx
print(嘿嘿.yy)??#?不存在的屬性:?yy

是不是很好玩呢?

小結

以上就是加載模塊的幾種方式,主要用途如下:

  • 導入一個在 sys.path 中的模塊,并且模塊名已知,那么直接使用 import 關鍵字即可;
  • 導入一個在 sys.path 中的模塊,但模塊名是運行時的一個字符串,那么使用 importlib 模塊的 import_module 函數(shù);
  • 導入一個不在 sys.path 中的模塊,使用 importlib.machinery 的各種 Loader,只要把模塊的路徑傳進去即可。當然啦,位于 sys.path 中的模塊也可以使用該方法,但顯然此時使用前兩種更為方便;
  • 直接創(chuàng)建一個模塊,通過繼承 module 類來實現(xiàn),并且還可以加入到 sys.modules 中。Python 有一個第三方模塊叫 sh,顧名思義是用來執(zhí)行 Linux Shell 命令的,它內(nèi)部就使用了繼承 module 類來創(chuàng)建模塊的這種方式。但是要知道 module 這個類解釋器沒有暴露給我們,我們需要通過 type(模塊) 或者 模塊.__class__ 的方式獲取;

到此這篇關于Python實現(xiàn)創(chuàng)建模塊的方法詳解的文章就介紹到這了,更多相關Python創(chuàng)建模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 6行Python代碼實現(xiàn)進度條效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI庫)

    6行Python代碼實現(xiàn)進度條效果(Progress、tqdm、alive-progress​​

    這篇文章主要介紹了6行Python代碼實現(xiàn)進度條效果(Progress、tqdm、alive-progress和PySimpleGUI庫),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • pandas實現(xiàn)選取特定索引的行

    pandas實現(xiàn)選取特定索引的行

    下面小編就為大家分享一篇pandas實現(xiàn)選取特定索引的行,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • python利用opencv實現(xiàn)顏色檢測

    python利用opencv實現(xiàn)顏色檢測

    這篇文章主要為大家詳細介紹了python利用opencv實現(xiàn)顏色檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • Python?Nuitka打包的實現(xiàn)步驟

    Python?Nuitka打包的實現(xiàn)步驟

    在Python應用程序開發(fā)中,打包是將代碼和依賴項組合成可執(zhí)行文件或庫的關鍵步驟之一,本文主要介紹了Python?Nuitka打包的實現(xiàn)步驟,感興趣的可以了解一下
    2023-12-12
  • 關于python多重賦值的小問題

    關于python多重賦值的小問題

    這篇文章主要給大家介紹了關于python多重賦值的小問題,文中通過示例代碼介紹的非常詳細,對大家學習或者使用python具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • 在Django框架中偽造捕捉到的URLconf值的方法

    在Django框架中偽造捕捉到的URLconf值的方法

    這篇文章主要介紹了在Django框架中偽造捕捉到的URLconf值的方法,Django是Python各色人氣框架中最為著名的一個,需要的朋友可以參考下
    2015-07-07
  • 深入理解Python單元測試unittest的使用示例

    深入理解Python單元測試unittest的使用示例

    本篇文章主要介紹了深入理解Python單元測試unittest的使用示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Python設計模式之代理模式實例詳解

    Python設計模式之代理模式實例詳解

    這篇文章主要介紹了Python設計模式之代理模式,結合實例形式較為詳細的分析了代理模式的概念、原理及Python定義、使用代理模式相關操作技巧,需要的朋友可以參考下
    2019-01-01
  • PyTorch中model.zero_grad()和optimizer.zero_grad()用法

    PyTorch中model.zero_grad()和optimizer.zero_grad()用法

    這篇文章主要介紹了PyTorch中model.zero_grad()和optimizer.zero_grad()用法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python操控mysql批量插入數(shù)據(jù)的實現(xiàn)方法

    Python操控mysql批量插入數(shù)據(jù)的實現(xiàn)方法

    這篇文章主要介紹了Python操控mysql批量插入數(shù)據(jù)的實現(xiàn)方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10

最新評論

桐庐县| 休宁县| 阳城县| 句容市| 陇川县| 陈巴尔虎旗| 筠连县| 辽源市| 余姚市| 乌拉特后旗| 祁阳县| 巢湖市| 吴川市| 凤翔县| 常山县| 右玉县| 越西县| 宁国市| 漯河市| 普陀区| 高台县| 嘉定区| 镶黄旗| 文昌市| 游戏| 陇西县| 天台县| 台州市| 仁布县| 宁明县| 洛南县| 丹江口市| 建阳市| 元江| 遵化市| 大兴区| 廉江市| 高台县| 收藏| 玉溪市| 福安市|