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

Python反射機(jī)制案例超詳細(xì)講解

 更新時(shí)間:2022年09月23日 10:44:39   作者:A-L-Kun  
反射就是通過(guò)字符串的形式,導(dǎo)入模塊;通過(guò)字符串的形式,去模塊尋找指定函數(shù),并執(zhí)行。利用字符串的形式去對(duì)象(模塊)中操作(查找/獲取/刪除/添加)成員,一種基于字符串的事件驅(qū)動(dòng)

一、導(dǎo)包案例

我們導(dǎo)入第三方庫(kù),可以使用import。那我們現(xiàn)在有一個(gè)需求,我需要?jiǎng)討B(tài)輸入一個(gè)模塊名,然后導(dǎo)入,這應(yīng)該怎么做呢?

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "反射.py"
__time__ = "2022/8/10 13:11"
# package = input("請(qǐng)輸入您想導(dǎo)入的庫(kù):")
package = "requests"  # 導(dǎo)入requests庫(kù)
req = __import__(package)  # 通過(guò)字符串的方式導(dǎo)入庫(kù)
resp = req.get("https://www.baidu.com")  # 調(diào)用庫(kù)中的函數(shù)
print(resp)

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

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "反射.py"
__time__ = "2022/8/10 13:11"
# package = input("請(qǐng)輸入要調(diào)用的模塊:")
package = "demo01"  # 導(dǎo)入第三方模塊
req = __import__(package)  # 導(dǎo)入庫(kù)
# func = input("請(qǐng)輸入要執(zhí)行的函數(shù):")
func = "func"  # 要執(zhí)行的函數(shù)
_ = getattr(req, func, None)  # 獲取名為func的函數(shù),如果沒(méi)有返回None
_()  # 調(diào)用函數(shù)

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

當(dāng)然,上面還存在一點(diǎn)點(diǎn)小問(wèn)題:那就是我的模塊名有可能不是在本級(jí)目錄中存放著。有可能是如下圖存放方式:

那么,我們應(yīng)該如何解決呢?這時(shí)可以添加一個(gè)參數(shù),fromlist

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "反射.py"
__time__ = "2022/8/10 13:11"
# package = input("請(qǐng)輸入要調(diào)用的模塊:")
package = "test.demo01"  # 級(jí)聯(lián)導(dǎo)入
req = __import__(package, fromlist=True)  # 導(dǎo)入庫(kù),注意要添加fromlist參數(shù)
# func = input("請(qǐng)輸入要執(zhí)行的函數(shù):")
func = "func"  # 要執(zhí)行的函數(shù)
_ = getattr(req, func, None)  # 獲取名為func的函數(shù),如果沒(méi)有返回None
_()  # 調(diào)用函數(shù)

二、基礎(chǔ)知識(shí)

1、是什么

什么是反射?

  • 有時(shí)我們要訪(fǎng)問(wèn)某個(gè)變量或是方法時(shí)并不知道到底有沒(méi)有這個(gè)變量或方法,所以就要做些判斷。判斷是否存在字符串對(duì)應(yīng)的變量及方法。
  • 我們知道訪(fǎng)問(wèn)變量時(shí)是不能加引號(hào)的,否則會(huì)被當(dāng)成字符串處理。如果要通過(guò)字符串找到對(duì)應(yīng)的變量,那該怎么辦呢?

反射就是用于解決上面兩個(gè)問(wèn)題而產(chǎn)生的,所謂反射,按我的理解就是反過(guò)來(lái)告訴我字符串是什么,是變量或者是方法

python的反射,它的核心本質(zhì)其實(shí)就是利用字符串的形式去對(duì)象(模塊)中操作(查找/獲取/刪除/添加)成員,一種基于字符串的事件驅(qū)動(dòng)!

python中訪(fǎng)問(wèn)類(lèi)或?qū)ο蟮某蓡T有三種方法:

如下所示 obj 為對(duì)象 var為變量 func為函數(shù)
1、obj.var 或 obj.func()
2、obj.__dict__['var']
3、getattr(obj,'var')

反射的方法:

hasattr(obj,name_str): 判斷objec是否有name_str這個(gè)方法或者屬性
getattr(obj,name_str): 獲取object對(duì)象中與name_str同名的方法或者函數(shù),有則返回地址
setattr(obj,name_str,value): 為object對(duì)象設(shè)置一個(gè)以name_str為名的value方法或者屬性
delattr(obj,name_str): 刪除object對(duì)象中的name_str方法或者屬性

2、怎么用

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "反射.py"
__time__ = "2022/8/10 13:11"
def func(self):
    print("hello world", self)
# 首先,我們創(chuàng)建一個(gè)學(xué)生類(lèi),這個(gè)學(xué)生類(lèi)沒(méi)有綁定任何屬性和方法
class Stu:
    pass
s = Stu()
# 我們可以使用反射機(jī)制,對(duì)類(lèi)成員進(jìn)行方法和屬性的綁定,如我們創(chuàng)建一個(gè)成員方法
if hasattr(s, "func"):  # 如果有這個(gè)函數(shù),進(jìn)行刪除,重新綁定
    delattr(s, "func")
setattr(s, "func", func)  # 進(jìn)行函數(shù)的綁定,注意,給Stu綁定和給s綁定的效果是不一樣的
_ = getattr(s, "func", None)  # 對(duì)這個(gè)函數(shù)進(jìn)行查找
_(s)  # 調(diào)用函數(shù),等于是調(diào)用了成員函數(shù),需要手動(dòng)傳遞self

三、使用案例

python反射機(jī)制在路由中比較常見(jiàn)

import requests
class Http(object):
    def get(self, url):
        """get請(qǐng)求"""
        res = requests.get(url)
        response = res.text
        return response
    def post(self, url):
        """post請(qǐng)求"""
        res = requests.post(url)
        response = res.text
        return response
# 使用反射后
url = "https://www.baidu.com"
method = input("請(qǐng)求方法>>>:")
h = Http()
if hasattr(h, method):
    func = getattr(h, method)
    res = func(url)
    """
    如果給通過(guò)類(lèi)獲取這個(gè)方法,則調(diào)用時(shí)需要傳入類(lèi)成員
    func = getattr(Http, method)
    res = func(h, url)
    """
    print(res)
else:
    print("你的請(qǐng)求方式有誤...")

到此這篇關(guān)于Python反射機(jī)制案例超詳細(xì)講解的文章就介紹到這了,更多相關(guān)Python反射機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mvc框架打造筆記之wsgi協(xié)議的優(yōu)缺點(diǎn)以及接口實(shí)現(xiàn)

    mvc框架打造筆記之wsgi協(xié)議的優(yōu)缺點(diǎn)以及接口實(shí)現(xiàn)

    這篇文章主要給大家介紹了關(guān)于mvc框架打造筆記之wsgi協(xié)議的優(yōu)缺點(diǎn)以及接口實(shí)現(xiàn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)的繼承和多態(tài)詳解

    Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)的繼承和多態(tài)詳解

    這篇文章主要介紹了Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)的繼承和多態(tài),結(jié)合實(shí)例形式詳細(xì)分析了Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)中類(lèi)的繼承與多態(tài)常見(jiàn)用法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-04-04
  • PyQt5簡(jiǎn)單讀取以及顯示圖片的應(yīng)用實(shí)例

    PyQt5簡(jiǎn)單讀取以及顯示圖片的應(yīng)用實(shí)例

    我們?cè)谶M(jìn)行圖像處理時(shí),經(jīng)常會(huì)用到讀取圖片并顯示出來(lái)這樣的操作,下面這篇文章主要給大家介紹了關(guān)于PyQt5簡(jiǎn)單讀取以及顯示圖片應(yīng)用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 讓python json encode datetime類(lèi)型

    讓python json encode datetime類(lèi)型

    python2.6+ 自帶的json模塊,不支持datetime的json encode,每次都需要手動(dòng)轉(zhuǎn)為字符串,很累人,我們可以自己封裝一個(gè)簡(jiǎn)單的方法處理此問(wèn)題。
    2010-12-12
  • 使用pygame實(shí)現(xiàn)垃圾分類(lèi)小游戲功能(已獲校級(jí)二等獎(jiǎng))

    使用pygame實(shí)現(xiàn)垃圾分類(lèi)小游戲功能(已獲校級(jí)二等獎(jiǎng))

    這篇文章主要介紹了使用pygame實(shí)現(xiàn)垃圾分類(lèi)小游戲功能(已獲校級(jí)二等獎(jiǎng)),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • python批量創(chuàng)建指定名稱(chēng)的文件夾

    python批量創(chuàng)建指定名稱(chēng)的文件夾

    這篇文章主要為大家詳細(xì)介紹了python批量創(chuàng)建指定名稱(chēng)的文件夾,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • pytorch sampler對(duì)數(shù)據(jù)進(jìn)行采樣的實(shí)現(xiàn)

    pytorch sampler對(duì)數(shù)據(jù)進(jìn)行采樣的實(shí)現(xiàn)

    今天小編就為大家分享一篇pytorch sampler對(duì)數(shù)據(jù)進(jìn)行采樣的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python學(xué)習(xí)筆記之json模塊和pickle模塊

    Python學(xué)習(xí)筆記之json模塊和pickle模塊

    json和pickle模塊是將數(shù)據(jù)進(jìn)行序列化處理,并進(jìn)行網(wǎng)絡(luò)傳輸或存入硬盤(pán),下面這篇文章主要給大家介紹了關(guān)于Python學(xué)習(xí)筆記之json模塊和pickle模塊的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Python全棧之面向?qū)ο蠡A(chǔ)

    Python全棧之面向?qū)ο蠡A(chǔ)

    這篇文章主要為大家介紹了Python面向?qū)ο蠡A(chǔ),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • python tornado修改log輸出方式

    python tornado修改log輸出方式

    今天小編就為大家分享一篇python tornado修改log輸出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-11-11

最新評(píng)論