欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python動(dòng)態(tài)導(dǎo)入模塊和反射機(jī)制詳解

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

一、前言

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

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

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

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

二、動(dòng)態(tài)導(dǎo)入模塊

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

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

但現(xiàn)在有這樣的需求,我需要?jiǎng)討B(tài)輸入一個(gè)模塊名,可以隨時(shí)訪問到導(dǎo)入模塊中的方法或者變量,怎么做呢?看下面。

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

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

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

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

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

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

那怎么辦呢?看下面。

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

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

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

1. getattr()

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

2、hasattr(object, name)

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

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

3、setattr(object, name, value)

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

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

4、delattr(object, name)

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

imp = input("請(qǐng)輸入你想導(dǎo)入的模塊名稱:")
count = __import__('first_level.{}'.format(imp), fromlist=True)
 
delattr(count, "flag")
 
print(count.flag)  # 此處再打印flag的值將會(huì)報(bào)錯(cuò),因?yàn)樯弦徊揭呀?jīng)將flag屬性刪除了

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

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

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

# 動(dòng)態(tài)導(dǎo)入模塊,并執(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最后一個(gè)字符串
if hasattr(module, inp):  # 判斷在commons模塊中是否存在inp這個(gè)字符串
  target_func = getattr(module, inp)  # 獲取inp的引用
  sum_ = target_func(2, 3)  # 執(zhí)行
  print(sum_)
else:
  print("404")

更多關(guān)于Python動(dòng)態(tài)導(dǎo)入模塊和反射機(jī)制請(qǐng)查看下面的相關(guān)文章

相關(guān)文章

  • 解讀Python編程中的命名空間與作用域

    解讀Python編程中的命名空間與作用域

    這篇文章主要介紹了Python編程中的命名空間與作用域,是Python入門學(xué)習(xí)中的重要知識(shí),需要的朋友可以參考下
    2015-10-10
  • Python中跨越多個(gè)文件使用全局變量的方法

    Python中跨越多個(gè)文件使用全局變量的方法

    全局變量是不屬于函數(shù)范圍的變量,可以在整個(gè)程序中使用,這表明全局變量也可以在函數(shù)體內(nèi)部或外部使用,這篇文章主要介紹了Python中跨越多個(gè)文件使用全局變量,需要的朋友可以參考下
    2023-09-09
  • Python中的json內(nèi)置庫(kù)詳解

    Python中的json內(nèi)置庫(kù)詳解

    這篇文章主要介紹了Python中的json內(nèi)置庫(kù)詳解,在學(xué)習(xí)做自動(dòng)化測(cè)試的過程中,python 里有一個(gè)內(nèi)置的 json 庫(kù),必須要學(xué)習(xí)好,json 是用于存儲(chǔ)和交換數(shù)據(jù)的語(yǔ)法,是一種輕量級(jí)的數(shù)據(jù)交換式使用場(chǎng)景,需要的朋友可以參考下
    2023-08-08
  • python3用PIL把圖片轉(zhuǎn)換為RGB圖片的實(shí)例

    python3用PIL把圖片轉(zhuǎn)換為RGB圖片的實(shí)例

    今天小編就為大家分享一篇python3用PIL把圖片轉(zhuǎn)換為RGB圖片的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python實(shí)現(xiàn)圖像識(shí)別的示例代碼

    python實(shí)現(xiàn)圖像識(shí)別的示例代碼

    這篇文章主要介紹了python實(shí)現(xiàn)圖像識(shí)別的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Python實(shí)現(xiàn)連通域標(biāo)記算法

    Python實(shí)現(xiàn)連通域標(biāo)記算法

    如果把圖像分為前景和背景兩部分,那么連通域就是連通在一起的前景,這種關(guān)系對(duì)于二值圖像來說比較明顯,下面我們就來了解一下連通域標(biāo)記算法原理及其Python實(shí)現(xiàn)吧
    2023-12-12
  • 利用Python實(shí)現(xiàn)快捷操作文件和文件夾

    利用Python實(shí)現(xiàn)快捷操作文件和文件夾

    shutil是Python標(biāo)準(zhǔn)庫(kù)中的一個(gè)模塊,提供了許多用于文件和文件夾操作的高級(jí)接口,本文主要詳細(xì)介紹了Python如何使用shutil實(shí)現(xiàn)快捷操作文件和文件夾,需要的可以參考下
    2024-02-02
  • 使用Python實(shí)現(xiàn)ELT統(tǒng)計(jì)多個(gè)服務(wù)器下所有數(shù)據(jù)表信息

    使用Python實(shí)現(xiàn)ELT統(tǒng)計(jì)多個(gè)服務(wù)器下所有數(shù)據(jù)表信息

    這篇文章主要介紹了使用Python實(shí)現(xiàn)ELT統(tǒng)計(jì)多個(gè)服務(wù)器下所有數(shù)據(jù)表信息,ETL,是英文Extract-Transform-Load的縮寫,用來描述將數(shù)據(jù)從來源端經(jīng)過抽取(extract)、轉(zhuǎn)換(transform)、加載(load)至目的端的過程,需要的朋友可以參考下
    2023-07-07
  • Python Datetime模塊和Calendar模塊用法實(shí)例分析

    Python Datetime模塊和Calendar模塊用法實(shí)例分析

    這篇文章主要介紹了Python Datetime模塊和Calendar模塊用法,結(jié)合實(shí)例形式分析了Python日期時(shí)間及日歷相關(guān)的Datetime模塊和Calendar模塊原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-04-04
  • Python基于read(size)方法讀取超大文件

    Python基于read(size)方法讀取超大文件

    這篇文章主要介紹了Python基于read(size)方法讀取超大文件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論