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

Python動態(tài)導入模塊和反射機制詳解

 更新時間:2020年02月18日 14:20:12   作者:IT界的游騎兵  
這篇文章主要介紹了Python動態(tài)導入模塊和反射機制詳解,需要的朋友可以參考下

一、前言

何謂動態(tài)導入模塊,就是說模塊的導入可以根據(jù)我們的需求動態(tài)的去導入,不是像一般的在代碼文件開頭固定的導入所需的模塊。

何謂反射機制,利用字符串的形式在模塊或?qū)ο笾胁僮鳎ú檎?獲取/刪除/添加)成員。

下面進入具體實例介紹環(huán)節(jié)。先創(chuàng)建一個示例文件example.py,簡單寫入幾個加減乘除函數(shù),如下,方便下文講解使用。

flag = 1  # 此變量在介紹反射機制時會用到
 
def my_sum(a, b):
 
  return a + b
 
def my_sub(a, b):
 
  return a - b

二、動態(tài)導入模塊

一般,如果我們想從其他文件引用上面的幾個函數(shù)方法,都會如下使用:

import example as count
 
# 加法
sum = count.my_sum(2, 3)
 
# 減法
sub = count.my_sub(6, 2)
 
print("sum: {}, sub: {}".format(sum, sub))

但現(xiàn)在有這樣的需求,我需要動態(tài)輸入一個模塊名,可以隨時訪問到導入模塊中的方法或者變量,怎么做呢?看下面。

imp = input("請輸入你需要導入的模塊名稱:")
count = __import__(imp)  # 這種方式就是通過輸入字符串導入你想導入的模塊 
 
# 加法
sum = count.my_sum(2, 3)
 
# 減法
sub = count.my_sub(6, 2)
 
print("sum: {}, sub: {}".format(sum, sub))

上面實現(xiàn)了動態(tài)輸入模塊名,從而使我們能夠?qū)肽K并且執(zhí)行里面的函數(shù)。但是上面有一個缺點,那就是執(zhí)行的函數(shù)被固定了。那么,我們能不能改進一下,動態(tài)輸入函數(shù)名,并且來執(zhí)行呢?看下面。

imp = input("請輸入你需要導入的模塊名稱:")
count = __import__(imp)
 
func = input("請輸入你需要使用的函數(shù)名:")
 
f = getattr(count, func, None)
 
# 加法
sum = f(2, 3)
print(sum)

getattr()方法的作用是:從導入的模塊中找到你需要調(diào)用的函數(shù)func,然后返回一個該函數(shù)的引用,沒有找到就煩會None。

這樣我們就實現(xiàn)了,動態(tài)導入一個模塊,并且動態(tài)輸入函數(shù)名然后執(zhí)行相應(yīng)方法。

不過,上面還存在一點點小問題:那就是我們的模塊有可能不是在本級目錄中存放著,有可能是如下圖存放方式:

那怎么辦呢?看下面。

imp = input("請輸入你想導入的模塊名稱:")
count = __import__('first_level.{}'.format(imp), fromlist=True)
 
fun = input("請輸入你想要使用的函數(shù)名:")
 
f = getattr(count, fun, None)
 
# 加法
sum = f(2, 3)
print(sum)

三、反射機制(又叫 python自?。?/h2>

我們先來介紹python的四個內(nèi)置函數(shù):

1. getattr()

這個函數(shù)是Python自省的核心函數(shù),具體使用上面已經(jīng)介紹了,她不僅可以用于在模塊中查找獲取相應(yīng)的方法和變量,也可以在一個對象中查找和獲取相應(yīng)的方法和變量,這里就不距離介紹了。

2、hasattr(object, name)

判斷模塊(或?qū)ο髈bject)是否包含名為name的方法或變量(hasattr是通過調(diào)用getattr(ojbect, name)是否拋出異常來實現(xiàn)的)

imp = input("請輸入你想導入的模塊名稱:")
count = __import__('first_level.{}'.format(imp), fromlist=True)
 
print(hasattr(count, "my_sum"))  # 判斷模塊count中是否存在my_sum方法,存在返回True

3、setattr(object, name, value)

這是相對應(yīng)的getattr()。參數(shù)是一個對象,一個字符串和一個任意值。字符串name可以是對象(object)中一個現(xiàn)有的屬性或一個新的屬性,這個函數(shù)將值(value)賦給屬性(name)的。使用示例,setattr(x, y, v)相當于x.y = v。

imp = input("請輸入你想導入的模塊名稱:")
count = __import__('first_level.{}'.format(imp), fromlist=True)
 
setattr(count, "flag", 0)  # 即使example模塊中沒有flag變量,此處也成立,沒有的話相當于給模塊中新增一個變量flag
 
print(count.flag)  # 打印出flag的值為0

4、delattr(object, name)

與setattr()相關(guān)的一組函數(shù)。參數(shù)是由一個對象(記?。ython中一切皆是對象)和一個字符串(name)組成的。name參數(shù)必須是對象屬性名之一。該函數(shù)刪除該對象的一個由字符串(name)指定的屬性。delattr(x, y)=del x.y.

imp = input("請輸入你想導入的模塊名稱:")
count = __import__('first_level.{}'.format(imp), fromlist=True)
 
delattr(count, "flag")
 
print(count.flag)  # 此處再打印flag的值將會報錯,因為上一步已經(jīng)將flag屬性刪除了

需要注意的是getattr,hasattr,setattr,delattr函數(shù)對模塊的修改都在內(nèi)存中進行,并不會影響文件中真實內(nèi)容。

5、基于反射機制模擬獲取web框架路由的示例

需求:輸入:www.xxx.com/example/my_sum,返回執(zhí)行my_sum的結(jié)果。

# 動態(tài)導入模塊,并執(zhí)行其中函數(shù)
url = input("url: ")
 
target_module = url.split('/')[-2]  # 分割url,取出模塊名
 
module = __import__('first_level.' + target_module, fromlist=True)
 
inp = url.split("/")[-1]  # 分割url,并取出url最后一個字符串
if hasattr(module, inp):  # 判斷在commons模塊中是否存在inp這個字符串
  target_func = getattr(module, inp)  # 獲取inp的引用
  sum_ = target_func(2, 3)  # 執(zhí)行
  print(sum_)
else:
  print("404")

更多關(guān)于Python動態(tài)導入模塊和反射機制請查看下面的相關(guān)文章

相關(guān)文章

  • Python實現(xiàn)自定義異常堆棧信息的示例代碼

    Python實現(xiàn)自定義異常堆棧信息的示例代碼

    當我們的程序報錯時,解釋器會將整個異常的堆棧信息全部輸出出來。解釋器會將異常產(chǎn)生的整個調(diào)用鏈都給打印出來,那么問題來了,我們能不能自定義這些報錯信息呢?本文就來為大家詳細講講
    2022-07-07
  • 對Python 數(shù)組的切片操作詳解

    對Python 數(shù)組的切片操作詳解

    今天小編就為大家分享一篇對Python 數(shù)組的切片操作詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • Python OpenCV學習之圖像濾波詳解

    Python OpenCV學習之圖像濾波詳解

    圖像濾波的作用簡單來說就是將一副圖像通過濾波器得到另一幅圖像;明確一個概念,濾波器又被稱為卷積核,濾波的過程又被稱為卷積;實際上深度學習就是訓練許多適應(yīng)任務(wù)的濾波器,本質(zhì)上就是得到最佳的參數(shù)。下面來跟隨小編一起深入了解一下圖像濾波吧
    2022-01-01
  • python wxpython 實現(xiàn)界面跳轉(zhuǎn)功能

    python wxpython 實現(xiàn)界面跳轉(zhuǎn)功能

    wxpython沒提供界面跳轉(zhuǎn)的方式,所以就需要借助threading模塊,本文給大家分享python wxpython 實現(xiàn)界面跳轉(zhuǎn)功能,感興趣的朋友跟隨小編一起看看吧
    2019-12-12
  • Python中的response.text與content區(qū)別詳解

    Python中的response.text與content區(qū)別詳解

    這篇文章主要介紹了Python中的response.text與content區(qū)別詳解,?從網(wǎng)絡(luò)請求下來的數(shù)據(jù),他們都是字節(jié)類型的,如果服務(wù)器不指定的話,默認編碼是"ISO-8859-1",我們使用text直接拿到的是字符串類型,沒有進行解碼操作,則會出現(xiàn)亂碼問題,需要的朋友可以參考下
    2023-12-12
  • CentOS 6.5下安裝Python 3.5.2(與Python2并存)

    CentOS 6.5下安裝Python 3.5.2(與Python2并存)

    這篇文章主要給大家介紹了在CentOS 6.5下安裝Python 3.5.2的方法教程,安裝后的python3與Python2并存,文中分享了詳細的方法步驟,對大家具有一定的參考學習價值,下面來一起看看吧。
    2017-06-06
  • python如何將兩個txt文件內(nèi)容合并

    python如何將兩個txt文件內(nèi)容合并

    這篇文章主要為大家詳細介紹了python如何將兩個txt文件內(nèi)容合并,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Python如何優(yōu)雅的實現(xiàn)自增枚舉類

    Python如何優(yōu)雅的實現(xiàn)自增枚舉類

    枚舉類型在編程中扮演著重要的角色,它們?yōu)樽兞抠x予了更加清晰的含義,然而,在Python中,實現(xiàn)自增的枚舉類并非直接而簡單的任務(wù),本文將深入討論如何通過不同的方式優(yōu)雅地實現(xiàn)自增的枚舉類,需要的朋友可以參考下
    2023-12-12
  • python實現(xiàn)煙花小程序

    python實現(xiàn)煙花小程序

    這篇文章主要為大家詳細介紹了python實現(xiàn)煙花小程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Python實現(xiàn)火柴人的設(shè)計與實現(xiàn)

    Python實現(xiàn)火柴人的設(shè)計與實現(xiàn)

    火柴人(Stick Figure)是一種極簡風格的圖形,通常由簡單的線段和圓圈組成,卻能生動地表達人物的姿態(tài)和動作,本文旨在介紹如何使用Python實現(xiàn)火柴人的設(shè)計與繪制,通過編程的方式,讓讀者了解火柴人背后的基本原理和實現(xiàn)方法,需要的朋友可以參考下
    2024-10-10

最新評論

酉阳| 灵石县| 嘉黎县| 墨脱县| 柏乡县| 长子县| 渝中区| 犍为县| 长丰县| 盘山县| 寿宁县| 中山市| 平泉县| 绩溪县| 上林县| 林周县| 昌吉市| 四子王旗| 和田市| 赞皇县| 梅州市| 雷州市| 邵阳市| 庄浪县| 满城县| 马公市| 潜山县| 固安县| 景洪市| 当阳市| 武隆县| 清水河县| 响水县| 永昌县| 耒阳市| 深州市| 荥经县| 济宁市| 乌兰浩特市| 成都市| 余江县|