一、反射
python反射,核心本质其实就是利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动! python的四个重要内置函数:getattr、hasattr、delattr和setattr较为全面的实现了基于字符串的反射机制,并且它们都是对内存中的模块进行操作,不会修改源文件。
(1)hasattr(obj,name_str): 判断objec是否有name_str这个方法或者属性
(2)getattr(obj,name_str): 获取object对象中与name_str同名的方法或者函数
(3)setattr(obj,name_str,value): 为object对象设置一个以name_str为名的value方法或者属性
(4)delattr(obj,name_str): 删除object对象中的name_str方法或者属性
1、getattr()
class Routing(object):
def __init__(self):
pass
def login(self):
print("这是登录页面")
def logout(self):
print("这是退出页面")
def home(self):
print("这是主页面")
def run(self):
inputUser = input("请输入url:").strip()
func = getattr(Routing(), inputUser)
func()
if __name__ == "__main__":
routing = Routing()
routing.run()
> 请输入url:home
> 这是主页面
2、hasattr()
如果输入的url不存在,则报错。修改一下
class Routing(object):
def __init__(self):
pass
def login(self):
print("这是登录页面")
def logout(self):
print("这是退出页面")
def home(self):
print("这是主页面")
def run(self):
inputUser = input("请输入url:").strip()
if hasattr(Routing(), inputUser):
func = getattr(Routing(), inputUser)
func()
else:
print("404")
if __name__ == "__main__":
routing = Routing()
routing.run()
>请输入url:www.baidu.com
>404
3、setattr()
def sing(self):
print(f"{self.name}正在唱歌中")
class User:
def __init__(self, name):
self.name = name
def eat(self):
print(f"{self.name}正在吃宵夜")
def run(self):
print(f"{self.name}正在跑步中")
choice = input(">>>")
user = User("panda")
if hasattr(user, choice):
func = getattr(user, choice)
print(func)
else:
# 装饰一个方法或属性,这里装饰的是一个sing方法
setattr(user, choice, sing)
func = getattr(user, choice)
func(user)
> sing
> panda正在唱歌中
4、delattr()
class User:
def __init__(self, name):
self.name = name
def eat(self):
print(f"{self.name}正在吃宵夜")
def run(self):
print(f"{self.name}正在跑步中")
choice = input(">>>")
user = User("panda")
# 这里以删除name属性为例
print(user.name)
try:
# 先判断属性是否存在,存在就删除
if hasattr(user, choice):
delattr(user, choice)
else:
pass
print(user.name)
except AttributeError:
print(f"删除{choice}成功")
>name
>panda
>删除name成功
5、反射应用场景
通过不同请求方式,调用不同函数
import requests
class Http(object):
def get(self, url):
res = requests.get(url)
response = res.text
return response
def post(self, url):
res = requests.post(url)
response = res.text
return response
# 使用反射后
url = "https://www.jianshu.com"
method = input("请求方式:")
http = Http()
if hasattr(http, method):
func = getattr(http, method)
res = func(url)
print(res)
else:
print("请求方式有误")