【python】python反射(自省)
1、什么是反射(自省)?
通过字符串映射object对象的方法或者属性
2、反射的方法:
hasattr(obj, name_str):判断object是否有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、用法介绍:
3.1 getattr
class User: def __init__(self, name): self.name = name def eat(self): print('%s is eating'%self.name) def run(self): print('%s is running'%self.name) c = User('Tom') while True: choose = input('>>>:') if hasattr(c, choose): func = getattr(c, choose) if type(func) == str: print(func) else: func() break else: print('操作有误,请重新输入')
3.2 setattr
def sing(self): print("%s is singing"%self.name) class User: def __init__(self, name): self.name = name def eat(self): print('%s is eating'%self.name) def run(self): print('%s is running'%self.name) c = User('Tom') while True: choose = input('>>>:') if hasattr(c, choose): func = getattr(c, choose) print(func) break else: #装饰一个方法或者属性,这里装饰的是sing方法 setattr(c, choose, sing) func = getattr(c, choose) func(c)#!!!!!注意,因为定义的sing方法含参self,所以要把c对象传进去 break
3.3 delattr
class User: def __init__(self, name): self.name = name def eat(self): print('%s is eating'%self.name) def run(self): print('%s is running'%self.name) c = User('Tom') print(c.name) choice = input('>>>:') 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("你的请求方式有误") # if method.upper() == 'GET': # result = h.get(url) # elif method.upper() == 'POST': # result = h.post(url) # else: # print('请求方法有误')
区别是啥呢?加入有100种请求方式,如果不用反射是不是很麻烦呢?
其它:
class A: def __init__(self): self.name = 'zhangjing' def method(self): print('method print') Inst = A() print(getattr(Inst,'name','not find')) print(getattr(Inst,'dsd','not find')) print(getattr(Inst,'method','default'))

浙公网安备 33010602011771号