51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 2237|回复: 2
打印 上一主题 下一主题

[转贴] python 代码优化,反射。

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-6-15 10:46:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人今天学到一个知识点,作为一个给菜鸟的科普,老鸟们不要见笑。
  1. #coding=utf-8
  2. import requests
  3. import json

  4. class op_request(object):
  5.     def __init__(self, request, request_body):
  6.         self.request_url = request["host"] + request["url"]
  7.         self.method = request["method"]
  8.         self.protocol = request["protocol"]
  9.         self.headers = request["headers"]
  10.         self.request_body = request_body

  11.     def send_request(self):
  12.         if self.method == "post" and self.protocol == "http":
  13.             re_dict = self.http_request_post()
  14.         return re_dict

  15.     def http_request_post(self):
  16.         url = self.request_url
  17.         request_body = self.request_body
  18.         headers = self.headers
  19.         session = requests.session()
  20.         session.headers.update(headers)
  21.         response = session.post(url, request_body)
  22.         data = json.loads(response.content)
  23.         re_dict ={}
  24.         re_dict["data"] = data
  25.         re_dict["status_code"] = response.status_code
  26.         return re_dict
复制代码

这个是一个封装了request操作的模块。当初始化好op_request这个类以后,我们去执行send_request拿到一个返回值。
一开始我在这里做了一个判断,当请求方法是post,请求协议是http的时候,那么执行http_request_post这个函数 (基于http的post请求。)
那么以后要增加模块的时候,很简单的就会写成。
if self.method == "post" and self.protocol == "https":
      re_dict = self.https_request_post()
然后在下面写一个def https_request_post(self)的方法。
如果有10种请求方法,我就会很呆萌的写10个if。
其实关于反射这个概念,我1个月以前就听说过,一直没有静下心来看,在写代码的时候虽然知道可以用反射做,不过为了快点交货,就先用这套代码应付下。
现在有时间了,就仔细看了下反射。发现,好东西很多,学不完的。
根据我自己的理解反射机制就是把你的函数名当做你的函数来调用。
  1. #coding=utf-8
  2. import requests
  3. import json


  4. class op_request(object):

  5.     def __init__(self, request, request_body):
  6.         self.request_url = request["host"] + request["url"]
  7.         self.method = request["method"]
  8.         self.protocol = request["protocol"]
  9.         self.headers = request["headers"]
  10.         self.request_body = request_body

  11.     def send_request(self):
  12.         func_name = self.protocol + "_" + self.method
  13.         try:
  14.             func = getattr(op_request, func_name)
  15.             re_dict = func(self)
  16.         except Exception,e:
  17.             print " no func_name"
  18.         return re_dict

  19.     def http_post(self):
  20.         url = self.request_url
  21.         request_body = self.request_body
  22.         headers = self.headers

  23.         session = requests.session()
  24.         session.headers.update(headers)
  25.         response = session.post(url, request_body)
  26.         data = json.loads(response.content)
  27.         re_dict ={}
  28.         re_dict["data"] = data
  29.         re_dict["status_code"] = response.status_code

  30.         return re_dict
复制代码

还是关注send_request()
这里我把初始化类的时候拿到协议和方法进行了一次拼接:func_name = self.protocol + "_" + self.method
然后用我拼接出来的函数名去定义一个方法,func = getattr(op_request, func_name)
然后执行这个方法:re_dict = func(self)
仔细的分解
self.protocol = http
self.method = post
那么func_name 就是 http_post
然后让程序去找http_post这个方法,如果存在就调用它。
本来要写不知道多少个的if判断,现在只要用这几行代码就搞定了了。
马上让代码有点高大上的感觉有没有。
难怪很多地方都需要开发转测试,这种对他们来说可能就是基本功。
关于getattr的用法我现在就想到这个,和他一起的还有hasattr,delattr,setattr。有新区的同学可以自己去用一下。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2017-6-15 11:39:08 | 只看该作者
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-25 23:01 , Processed in 0.064954 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表