我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python怎么将一个类方法变为多个方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python怎么将一个类方法变为多个方法

本篇内容主要讲解“Python怎么将一个类方法变为多个方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么将一个类方法变为多个方法”吧!

1、ddt 如何实现参数化?

先回顾一下上篇文章中 ddt 库的写法:

import unittest from ddt import ddt,data,unpack @ddt class MyTest(unittest.TestCase):     @data((3, 1), (-1, 0), (1.2, 1.0))     @unpack     def test(self, first, second):         pass

ddt 可提供 4 个装饰器:1 个加在类上的 @ddt,还有 3 个加在类方法上的 @data、@unpack 和  @file_data(前文未提及)。

先看看加在类方法上的三个装饰器的作用:

# ddt 版本(win):1.2.1 def data(*values):     global index_len     index_len = len(str(len(values)))     return idata(values)  def idata(iterable):     def wrapper(func):         setattr(func, DATA_ATTR, iterable)         return func     return wrapper  def unpack(func):     setattr(func, UNPACK_ATTR, True)     return func  def file_data(value):     def wrapper(func):         setattr(func, FILE_ATTR, value)         return func     return wrapper

它们的共同作用是在类方法上 setattr() 添加属性。至于这些属性在什么时候使用?下面看看加在类上的 @ddt 装饰器源码:

Python怎么将一个类方法变为多个方法

Python怎么将一个类方法变为多个方法

第一层 for 循环遍历了所有的类方法,然后是 if/elif 两条分支,分别对应  DATA_ATTR/FILE_ATTR,即对应参数的两种来源:数据(@data)和文件(@file_data)。

elif 分支有解析文件的逻辑,之后跟处理数据相似,所以我们把它略过,主要看前面的 if 分支。这部分的逻辑很清晰,主要完成的任务如下:

  • 遍历类方法的参数键值对

  • 根据原方法及参数对,创建新的方法名

  • 获取原方法的文档字符串

  • 对元组和列表类型的参数作解包

  • 在测试类上添加新的测试方法,并绑定参数与文档字符串

Python怎么将一个类方法变为多个方法

分析源码,可以看出,@data、@unpack 和 @file_data 这三个装饰器主要是设置属性并传参,而 @ddt  装饰器才是核心的处理逻辑。

这种将装饰器分散(分别加在类与类方法上),再组合使用的方案,很不优雅。为什么就不能统一起来使用呢?后面我们会分析它的难言之隐,先按下不表,看看其它的实现方案是怎样的?

2、parameterized 如何实现参数化?

先回顾一下上篇文章中 parameterized 库的写法:

import unittest from parameterized import parameterized class MyTest(unittest.TestCase):     @parameterized.expand([(3,1), (-1,0), (1.5,1.0)])     def test_values(self, first, second):         self.assertTrue(first > second)

它提供了一个装饰器类 @parameterized,源码如下(版本 0.7.1),主要做了一些初始的校验和参数解析,并非我们关注的重点,略过。

Python怎么将一个类方法变为多个方法

我们主要关注这个装饰器类的 expand() 方法,它的文档注释中写到:

A "brute force" method of parameterizing test cases. Creates new test cases  and injects them into the namespace that the wrapped function is being defined  in. Useful for parameterizing tests in subclasses of 'UnitTest', where Nose test  generators don't work.

关键的两个动作是:“creates new test cases(创建新的测试单元)”和“inject them into the  namespace…(注入到原方法的命名空间)”。

关于第一点,它跟 ddt 是相似的,只是一些命名风格上的差异,以及参数的解析及绑定不同,不值得太关注。

Python怎么将一个类方法变为多个方法

最不同的则是,怎么令新的测试方法生效?

parameterized 使用的是一种“注入”的方式:

Python怎么将一个类方法变为多个方法

inspect 是个功能强大的标准库,在此用于获取程序调用栈的信息。前三句代码的目的是取出 f_locals,它的含义是“local namespace  seen by this frame”,此处 f_locals 指的就是类的局部命名空间。

说到局部命名空间,你可能会想到 locals(),但是,我们之前有文章提到过“locals() 与 globals() 的读写问题”,locals()  是可读不可写的,所以这段代码才用了 f_locals。

3、pytest 如何实现参数化?

按惯例先看看上篇文章中的写法:

import pytest @pytest.mark.parametrize("first,second", [(3,1), (-1,0), (1.5,1.0)]) def test_values(first, second):     assert(first > second)

首先看到“mark”,pytest 里内置了一些标签,例如  parametrize、timeout、skipif、xfail、tryfirst、trylast  等,还支持用户自定义的标签,可以设置执行条件、分组筛选执行,以及修改原测试行为等等。

用法也是非常简单的,然而,其源码可复杂多了。我们这里只关注 parametrize,先看看核心的一段代码:

Python怎么将一个类方法变为多个方法

根据传入的参数对,它复制了原测试方法的调用信息,存入待调用的列表里。跟前面分析的两个库不同,它并没有在此创建新的测试方法,而是复用了已有的方法。在  parametrize() 所属的 Metafunc 类往上查找,可以追踪到 _calls 列表的使用位置:

Python怎么将一个类方法变为多个方法

最终是在 Function 类中执行:

Python怎么将一个类方法变为多个方法

好玩的是,在这里我们可以看到几行神注释……

Python怎么将一个类方法变为多个方法

阅读(粗浅涉猎) pytest  的源码,真的是自讨苦吃……不过,依稀大致可以看出,它在实现参数化时,使用的是生成器的方案,遍历一个参数则调用一次测试方法,而前面的 ddt 和  parameterized 则是一次性把所有参数解析完,生成 n 个新的测试方法,再交给测试框架去调度。

对比一下,前两个库的思路很清晰,而且由于其设计单纯是为了实现参数化,不像 pytest 有什么标记和过多的抽象设计,所以更易读易懂。前两个库发挥了  Python 的动态特性,设置类属性或者注入局部命名空间,而 pytest 倒像是从什么静态语言中借鉴的思路,略显笨拙

到此,相信大家对“Python怎么将一个类方法变为多个方法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python怎么将一个类方法变为多个方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python怎么将一个类方法变为多个方法

本篇内容主要讲解“Python怎么将一个类方法变为多个方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么将一个类方法变为多个方法”吧!1、ddt 如何实现参数化?先回顾一下上篇文
2023-06-16

Python中怎么将一个类方法变为多个方法

本篇文章给大家分享的是有关Python中怎么将一个类方法变为多个方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、ddt 如何实现参数化?先回顾一下上篇文章中 ddt 库的
2023-06-16

JavaScript如何将方法作为一个对象

这篇文章主要介绍了JavaScript如何将方法作为一个对象,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。将方法作为一个对象// 定义var test = { fun1
2023-06-03

Flutter将整个App变为灰色的方法是什么

这篇文章主要介绍“Flutter将整个App变为灰色的方法是什么”,在日常操作中,相信很多人在Flutter将整个App变为灰色的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Flutter将整个A
2023-06-22

java多个类共享变量的方法是什么

在Java中,可以实现多个类共享变量的方法有以下几种:静态变量:使用static关键字声明的变量是类级别的变量,可以被该类的所有实例共享。其他类可以通过类名直接访问静态变量。public class MyClass {public stat
2023-10-25

Python类中怎么定义多个构造器方法重载与泛方法

这篇文章主要介绍“Python类中怎么定义多个构造器方法重载与泛方法”,在日常操作中,相信很多人在Python类中怎么定义多个构造器方法重载与泛方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python类
2023-07-05

php怎么调用一个类中的方法

在PHP中,可以利用“->”来调用一个类中的方法,该符号用于引用类实例的方法和属性,是对象执行方法或取得属性用的,语法为“$obj->a”。
2016-05-01

c#怎么调用另一个类的方法

在 c# 中调用另一个类的方法有三种方式:直接调用:创建该类的实例,然后使用实例调用方法。通过接口调用:创建接口,定义要调用的方法;创建实现该接口的类;使用接口创建类的实例,然后通过接口调用方法。静态方法调用:如果方法是静态的,则直接使用类
c#怎么调用另一个类的方法
2024-05-14

Python同步方法怎么变为异步方法

本文小编为大家详细介绍“Python同步方法怎么变为异步方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python同步方法怎么变为异步方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。背景在我们平时的Fas
2023-06-29

java中将一个实体类复制到另一个实体类的三种方法

这两天在做发票识别时,遇到一个问题,有一张发票表(假设为invoice_OCR_success)和一张我根据发票表新建的表(假设为invoice_OCR_fail),两张表有些字段名是相同的,有时需要把其中一张表的实例在另一张表里保存一份,
2023-08-16

spring注解识别一个接口的多个实现类方法

1.比如有一个接口如下:public interface Filter { public String doFilter(String param); }
2023-05-31

Python 类中定义多个构造器方法重载与泛方法

这篇文章主要为大家介绍了Python 类中定义多个构造器方法重载与泛方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-22

Python实现将一个大文件按段落分隔为多个小文件的简单操作方法

本文实例讲述了Python实现将一个大文件按段落分隔为多个小文件的简单操作方法。分享给大家供大家参考,具体如下: 今天帮同学处理一点语料。语料文件有点大,并且是以连续两个换行符作为段落标志,他想把它按段落分隔成多个小文件,即每3个段落组成一
2022-06-04

判断一个变量是数组Array类型的方法

JavaScript中如何判断一个变量是数组Array类型呢?本文向大家提供一个比较不错的方法,可以说是无懈可击了
2022-11-15

shell判断一个变量是否为空方法总结

shell中如何判断一个变量是否为空 shell编程中,对参数的错误检查项中,包含了变量是否赋值(即一个变量是否为空),判断变量为空方法如下:1.变量通过" "引号引起来#!/bin/sh para1= if [ ! -n "$para1"
2022-06-04

python多个进程间调用变量的方法是什么

在Python中,多个进程之间可以通过以下几种方法共享变量:1. 使用共享内存(Shared Memory):通过使用共享内存,多个进程可以访问同一块内存区域。在Python中,可以使用`multiprocessing.Value`和`mu
2023-09-29

Android中将一个图片切割成多个图片的实现方法

以下是封装好的两个类,可以实现图片的切割。仅供参考和学习。 一个是ImagePiece类,此类保存了一个Bitmap对象和一个标识图片的顺序索引的int变量。 代码如下:package arui319.blog.csdn.net; imp
2022-06-06

梳理:python—同一个类中的方法调用

为什么突然在此提到这个梳理问题呢?因为在自己实践综合练习学过的知识时,突然觉得有些知识点的运用总是不成功,于是翻过课本进行回顾,总是觉得是对的,可是当再进一步思考“既然是对的,为什么在程序中总是不成功呢?”,后来发现,自己理所当然的理解(忽
2023-01-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录