日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python反射機制案例超詳細講解_python

作者:A-L-Kun ? 更新時間: 2022-11-13 編程語言

一、導包案例

我們導入第三方庫,可以使用import。那我們現在有一個需求,我需要動態輸入一個模塊名,然后導入,這應該怎么做呢?

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

上面我們實現了動態輸入模塊名,從而使我們能夠輸入模塊名并且執行里面的函數。但是上面有一個缺點,那就是執行的函數被固定了。那么,我們能不能改進一下,動態輸入函數名,并且來執行呢?

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

面我們就實現了,動態導入一個模塊,并且動態輸入函數名然后執行相應功能。

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

那么,我們應該如何解決呢?這時可以添加一個參數,fromlist

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "反射.py"
__time__ = "2022/8/10 13:11"
# package = input("請輸入要調用的模塊:")
package = "test.demo01"  # 級聯導入
req = __import__(package, fromlist=True)  # 導入庫,注意要添加fromlist參數
# func = input("請輸入要執行的函數:")
func = "func"  # 要執行的函數
_ = getattr(req, func, None)  # 獲取名為func的函數,如果沒有返回None
_()  # 調用函數

二、基礎知識

1、是什么

什么是反射?

  • 有時我們要訪問某個變量或是方法時并不知道到底有沒有這個變量或方法,所以就要做些判斷。判斷是否存在字符串對應的變量及方法。
  • 我們知道訪問變量時是不能加引號的,否則會被當成字符串處理。如果要通過字符串找到對應的變量,那該怎么辦呢?

反射就是用于解決上面兩個問題而產生的,所謂反射,按我的理解就是反過來告訴我字符串是什么,是變量或者是方法

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

python中訪問類或對象的成員有三種方法:

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

反射的方法:

hasattr(obj,name_str): 判斷objec是否有name_str這個方法或者屬性
getattr(obj,name_str): 獲取object對象中與name_str同名的方法或者函數,有則返回地址
setattr(obj,name_str,value): 為object對象設置一個以name_str為名的value方法或者屬性
delattr(obj,name_str): 刪除object對象中的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)
# 首先,我們創建一個學生類,這個學生類沒有綁定任何屬性和方法
class Stu:
    pass
s = Stu()
# 我們可以使用反射機制,對類成員進行方法和屬性的綁定,如我們創建一個成員方法
if hasattr(s, "func"):  # 如果有這個函數,進行刪除,重新綁定
    delattr(s, "func")
setattr(s, "func", func)  # 進行函數的綁定,注意,給Stu綁定和給s綁定的效果是不一樣的
_ = getattr(s, "func", None)  # 對這個函數進行查找
_(s)  # 調用函數,等于是調用了成員函數,需要手動傳遞self

三、使用案例

python反射機制在路由中比較常見

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

原文鏈接:https://blog.csdn.net/qq_62789540/article/details/126265034

欄目分類
最近更新