1.什么是反射:
通过字符串映射object对象的方法或者属性
2.反射的方法
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方法或者属性
3.方法的简单介绍
getattr:
class User:
def __init__(self,name):
self.name = name
def eat(self):
print('%s 正在吃夜宵 ...'%self.name)
def run(self):
print('%s 正在跑步中 ...'%self.name)
# 场景: 当用户在操作时,面对用户不同的操作就需要调用不同的函数
# 如果用if,elif语句的话,会存在一个问题,当用户有500个不同的操作,
# 就需要写500次if,elif。这样就会出现代码重复率高,而且还不易维护
# 这时候反射就出现了,通过字符串映射对象或方法
# 实例化一个对象: 胖毛
c = User('胖毛')
# 用户输入指令
choose = input('>>>:')
# 通过hasattr判断属性/方法是否存在
if hasattr(c,choose):
# 存在,用一个func接收
func = getattr(c,choose)
# 通过类型判断是属性还是方法
if type(func) == str:
print(func)
else:
func()
else:
print('操作有误,请重新输入')
setatter:
#_author_='shaojie'
#-*- coding:utf-8 -*-
def sing(self):
print("%s 正在唱歌中..."%self.name)
class User:
def __init__(self,name):
self.name = name
def eat(self):
print('%s 正在吃夜宵 ...'%self.name)
def run(self):
print('%s 正在跑步中 ...'%self.name)
choice = input('>>>:')
c = User('胖毛')
if hasattr(c, choice):
func = getattr(c, choice)
print(func)
else:
# 装饰一个方法或者属性,这里装饰的是一个sing方法
setattr(c, choice, sing)
func = getattr(c,choice)
func(c)
delattr:
#_author_='shaojie'
#-*- coding:utf-8 -*-
class User:
def __init__(self,name):
self.name = name
def eat(self):
print('%s 正在吃夜宵 ...'%self.name)
def run(self):
print('%s 正在跑步中 ...'%self.name)
choice = input('>>>:')
c = User('胖毛')
# 这里以删除name属性为例
print(c.name)
try:
# 先判断属性是否存在,存在就删除
if hasattr(c,choice):
delattr(c,choice)
else:
pass
print(c.name)
# 捕获没有属性抛出的异常
except AttributeError:
print('删除%s成功'%choice)
4.反射的实际应用场景
在我们做接口自动化的时候,需要通过不同的请求方式,调用不同的函数
未使用反射之前
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/u/14140bf8f6c7"
method = input("请求方法>>>:")
h = Http()
if method.upper() == 'GET':
result = h.get(url)
elif method.upper() == 'POST':
result = h.post(url)
else:
print('请求方式有误....')
print(result)
使用反射之后
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/u/14140bf8f6c7"
method = input("请求方法>>>:")
h = Http()
if hasattr(h,method):
func = getattr(h,method)
res = func(url)
print(res)
else:
print("你的请求方式有误...")
好了,今天到这了,该睡觉了,明天又是一条好汉。