Python 使用装饰器装饰类
1、装饰器装饰函数
了解过或学过装饰器的同学都知道,Python 中的装饰器是可以装饰函数的,如:
# 定义一个装饰器
def decorator(func):
def inner(*args,**kwargs):
print("被装饰函数新增的功能")
return func(*args,**kwargs)
return inner
# 定义一个函数test,使用decorator进行装饰
@decorator
def test(a,b):
print("a= %s b= %s" %(a,b)) #调用test函数
test("a","b")
以上代码输出:
被装饰函数新增的功能
a= a b= b
2、装饰器装饰类
那么,装饰器除了可以装饰函数以外,还能装饰类吗?答案是肯定的
首先看一下装饰器装饰类的语法
语法和装饰函数是一个的
# 定义一个装饰器
def decorator(cls):
print("这里可以写被装饰类新增的功能")
return cls # 定义一个类 A,并使用decorator装饰器装饰
@decorator # 装饰器的本质 A = decorator(A),装饰器返回类本身,还是之前的类,只是在返回之前增加了额外的功能
class A(object):
def __init__(self):
pass def test(self):
print("test")
3、装饰器在自动化测试的中使用场景
目前在自动化框架设计时,为了便于测试脚本的维护,我们一般会将测试数据和测试用例进行分离,那该如何分离呢?
一种方法是将测试类和测试数据进行动态关联来获取测试类需要的测试数据,在 Python 中这种方式可通过装饰器装饰测试类来实现。
思路:
1、新建测试用例时,可通过测试类名和测试数据文件(类名和存储数据的文件名称一样)进行一一对应关联
2、使用装饰器动态解析测试数据
3、将解析的测试数据动态赋给对应的测试类
4、测试类可使用该数据进行脚本的编写
框架如下:

代码结构如下:
├─common
│ __init__.py
│
├─config
│ Login.json
│ __init__.py
│
├─email
│ __init__.py
│
├─logs
│ __init__.py
│
├─parse
│ │ decorator.py
│ │ __init__.py
│
│
├─report
│ __init__.py
│
├─request
│ __init__.py
│
└─testcase
login.py
__init__.py
动态获取测试数据的装饰器
import os
import json def test_data(cls):
cls_name = cls.__name__
param_file = os.path.join("..\config", cls_name + ".json")
cls.parameters = json.load(open(param_file))
return cls
测试数据
{
"test_login": {"url": "api/v2/login"},
"test_logout": {"url": "api/v2/logout"}
}
测试用例
import unittest from AutoTestFrameDemo.parse.decorator import test_data @test_data
class Login(unittest.TestCase):
def test_login(self):
print(Login.parameters.get("test_login")) def test_logout(self):
print(Login.parameters.get("test_logout")) if __name__ == "__main__":
unittest.main()
更多内容请关注微信公众号:

Python 使用装饰器装饰类的更多相关文章
- Python 装饰器装饰类中的方法
title: Python 装饰器装饰类中的方法 comments: true date: 2017-04-17 20:44:31 tags: ['Python', 'Decorate'] categ ...
- python 进阶篇 函数装饰器和类装饰器
函数装饰器 简单装饰器 def my_decorator(func): def wrapper(): print('wrapper of decorator') func() return wrapp ...
- python 装饰器 对类和函数的装饰
#装饰器:对类或者函数进行功能的扩展 很多需要缩进的没有进行缩进'''#第一步:基本函数def laxi(): print('拉屎')#调用函数laxi()laxi() print('======= ...
- python 装饰器(七):装饰器实例(四)类装饰器装饰类以及类方法
类装饰器装饰类方法 不带参数 from functools import wraps import types class CatchException: def __init__(self,orig ...
- python 装饰器(八):装饰器实例(五)函数装饰器装饰类以及类方法
函数装饰器装饰类 单例模式 from functools import wraps def singleton(cls): instances = {} @wraps(cls) def get_ins ...
- python编程系列---多个装饰器装饰一个函数的执行流程
首先看一个例子 ''' 多个装饰器装饰一个函数 ''' # 定义第一个装饰器 def set_func1(func): def wrapper1(*args,**kwargs): print('装饰内 ...
- Python:有参装饰器与多个装饰器装饰一个函数
有参装饰器 def timmerout(flag1): #flag1 =flag def timmer(f): def inner(*args,**kwargs): if flag1: start_t ...
- typescript装饰器定义 类装饰器 属性装饰器 装饰器工厂
/* 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常 ...
- Python函数07/有参装饰器/多个装饰器装饰一个函数
Python函数07/有参装饰器/多个装饰器装饰一个函数 目录 Python函数07/有参装饰器/多个装饰器装饰一个函数 内容大纲 1.有参装饰器 2.多个装饰器装饰一个函数 3.今日总结 3.今日练 ...
随机推荐
- LeetCode 104. 二叉树的最大深度(Maximum Depth of Binary Tree)
104. 二叉树的最大深度 104. Maximum Depth of Binary Tree 题目描述 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说 ...
- LeetCode 783. 二叉搜索树结点最小距离(Minimum Distance Between BST Nodes)
783. 二叉搜索树结点最小距离 LeetCode783. Minimum Distance Between BST Nodes 题目描述 给定一个二叉搜索树的根结点 root, 返回树中任意两节点的 ...
- 数据结构-链式栈c++
栈的最基本特点先进后出,本文简单介绍一下用c++写的链式栈 头文件 #ifndef LINKEDSTACK_H #define LINKEDSTACK_H template<class T> ...
- Oracle创建视图权限不足
Oracle 在创建用户的时候如果直接给用户DBA权限,那么在B用户中可以直接查询A用户的表,但是在创建视图时就会报无权限,在这种情况下需要再在被访问的A用户里面去给予要访问该表的B用户授权. --创 ...
- stdmap 用 at() 取值,如果 key 不存在,不好意思,程序崩溃。QMap 用 value()取值,如果 key 不存在,不会崩溃,你还可以指定默认值
我觉得 Qt6 最应该升级的是容器类 stdmap 在遍历的时候,同时获取 key 与 value 非常方便: for(auto& var:map){ qDebug()<<v ...
- javascript之new操作符
new 运算符做了哪些事情 1.新生成了一个对象 2.链接到原型 3.绑定 this 4.返回新对象 自己实现一个 new function create() { // 创建一个空的对象 let ob ...
- PHP Math常量
常量名 常量名 常量值 PHP M_E e 2.7182818284590452354 4 M_EULER Euler 常量 0.57721566490153286061 5.2.0 M_LNPI l ...
- [v]Windows下Git安装指南
参考<Git权威指南>安装整理,图书配套网址参见[1] 1. Cygwin下安装配置Git 1. 在Windows下安装配置Git有2种不同的方案 (1)msysGit, (2)Cygwi ...
- Bootstrap4 入门
http://www.runoob.com/bootstrap4/bootstrap4-navs.html 共五个部分 1 <!DOCTYPE html> <html lang=&q ...
- echarts3关系图:力引导布局, 固定某些节点
在数组里设置 fixed: true,<a href='http://echarts.baidu.com/option.html#series-graph.data.fixed'>官方文档 ...