反射其他模块的成员
输出结果
True
反射22222
小菠萝
fanshe 是另一个模块
反射的应用一
需求
- 打开浏览器,访问一个网站
- 单击登录就跳转到登录界面
- 单击注册就跳转到注册界面
- 单击的其实是一个个的链接,每一个链接都会有一个函数或者方法来处理
未使用反射前
class Web: def login(self): print('欢迎来到登录页面') def register(self): print('欢迎来到注册页面') def save(self): print('欢迎来到存储页面') while True: obj = Web() choose = input(">>>").strip() if choose == 'login': obj.login() elif choose == 'register': obj.register() elif choose == 'save': obj.save()
使用反射后
class Web: def login(self): print('欢迎来到登录页面') def register(self): print('欢迎来到注册页面') def save(self): print('欢迎来到存储页面') while True: obj = Web() choose = input(">>>").strip() # 判断对象是否有对应的方法 if hasattr(obj, choose): # 获取对应的方法 f = getattr(obj, choose) # 执行方法 f()
反射的应用二
在做接口自动化测试的时候,我们一般都会封装 BaseRequest 类来进行复用,类里面会封装不同请求方法
未使用反射前
class BaseRequest: req = requests.Session() def get(self, url): resp = self.req.get(url) print("==get==") return resp def post(self, url): resp = self.req.post(url) print("==post==") return resp def put(self, url): resp = self.req.put(url) print("==put==") return resp # 不使用反射的方法 def main(self, method, url): if method == "get": self.get(url) elif method == "post": self.post(url) elif method == "put": self.put(url)
使用反射后
# 使用反射的方法 def main_attr(self, method, url): if hasattr(self, method): func = getattr(self, method) func(url)
执行代码
request = BaseRequest() # 不使用反射 request.main("get", "http://www.baidu.com") request.main("post", "http://www.baidu.com") request.main("put", "http://www.baidu.com") # 使用反射 request.main_attr("get", "http://www.baidu.com") request.main_attr("post", "http://www.baidu.com") request.main_attr("put", "http://www.baidu.com") # 输出结果 ==get== ==post== ==put== ==get== ==post== ==put==
总结
当封装了多个方法,然后需要根据不同条件去调用不同方法的时候,就可以考虑使用反射了,代码量少不是丁点半点