广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中怎么将一个类方法变为多个方法
  • 875
分享到

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

2023-06-16 16:06:41 875人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

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

本篇文章给大家分享的是有关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中怎么将一个类方法变为多个方法

以上就是Python中怎么将一个类方法变为多个方法,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网Python频道。

--结束END--

本文标题: Python中怎么将一个类方法变为多个方法

本文链接: https://www.lsjlt.com/news/284360.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Python中怎么将一个类方法变为多个方法
    本篇文章给大家分享的是有关Python中怎么将一个类方法变为多个方法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、ddt 如何实现参数化?先回顾一下上篇文章中 ddt 库的...
    99+
    2023-06-16
  • Python怎么将一个类方法变为多个方法
    本篇内容主要讲解“Python怎么将一个类方法变为多个方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python怎么将一个类方法变为多个方法”吧!1、ddt 如何实现参数化先回顾一下上篇文章...
    99+
    2023-06-16
  • JavaScript如何将方法作为一个对象
    这篇文章主要介绍了JavaScript如何将方法作为一个对象,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。将方法作为一个对象// 定义var test&n...
    99+
    2023-06-03
  • Flutter将整个App变为灰色的方法是什么
    ...
    99+
    2023-06-22
  • Python类中怎么定义多个构造器方法重载与泛方法
    这篇文章主要介绍“Python类中怎么定义多个构造器方法重载与泛方法”,在日常操作中,相信很多人在Python类中怎么定义多个构造器方法重载与泛方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python类...
    99+
    2023-07-05
  • php怎么调用一个类中的方法
    本文操作环境:Windows10系统、PHP7.1版、Dell G3电脑。php怎么调用一个类中的方法在php中,可以使用“->”来调用类中的方法。新建一个php文件,命名为test.php,用于讲解php类方法中怎么调用。使用hea...
    99+
    2016-05-01
    php
  • java多个类共享变量的方法是什么
    在Java中,可以实现多个类共享变量的方法有以下几种: 静态变量:使用static关键字声明的变量是类级别的变量,可以被该类的所有...
    99+
    2023-10-25
    java
  • java中将一个实体类复制到另一个实体类的三种方法
    这两天在做发票识别时,遇到一个问题,有一张发票表(假设为invoice_OCR_success)和一张我根据发票表新建的表(假设为invoice_OCR_fail),两张表有些字段名是相同的,有时需要把其中一张表的实例在另一张表里保存一份,...
    99+
    2023-08-16
    java spring 开发语言 json
  • Android中将一个图片切割成多个图片的实现方法
    以下是封装好的两个类,可以实现图片的切割。仅供参考和学习。 一个是ImagePiece类,此类保存了一个Bitmap对象和一个标识图片的顺序索引的int变量。 代码如下:pac...
    99+
    2022-06-06
    方法 图片 Android
  • php中删除一个变量的方法
    小编给大家分享一下php中删除一个变量的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在php中,可以使用unset()函数来删除一个变量,该函数用于销毁给定...
    99+
    2023-06-15
  • Python 类中定义多个构造器方法重载与泛方法
    目录引言什么是“泛方法”?举个栗子 一般实现有没有更好的方式?缺点#1 单分派#2 不支持 typing替代方案:multimethod 库优势更更好的实践方...
    99+
    2023-03-22
    Python 类多个构造器方法 Python 方法重载泛方法
  • 梳理:python—同一个类中的方法调用
    为什么突然在此提到这个梳理问题呢 因为在自己实践综合练习学过的知识时,突然觉得有些知识点的运用总是不成功,于是翻过课本进行回顾,总是觉得是对的,可是当再进一步思考“既然是对的,为什么在程序中总是不成功呢?”,后来发现,自己理所当然的理解(...
    99+
    2023-01-30
    类中 方法 python
  • Flutter将整个App变为灰色的简单实现方法
    目录前言Flutter中实现整个App变为灰色ColorFiltered(颜色过滤器)追踪源码总结前言 为了让更多的人永远记住12月13日,各大厂都在这一天将应用变灰了。 那么接下...
    99+
    2022-11-12
  • Python同步方法怎么变为异步方法
    本文小编为大家详细介绍“Python同步方法怎么变为异步方法”,内容详细,步骤清晰,细节处理妥当,希望这篇“Python同步方法怎么变为异步方法”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。背景在我们平时的Fas...
    99+
    2023-06-29
  • Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
    本文实例讲述了Python实现将一个大文件按段落分隔为多个小文件的简单操作方法。分享给大家供大家参考,具体如下: 今天帮同学处理一点语料。语料文件有点大,并且是以连续两个换行符作为段落标志,他想把它按段落分...
    99+
    2022-06-04
    多个 段落 操作方法
  • shell判断一个变量是否为空方法总结
    shell中如何判断一个变量是否为空 shell编程中,对参数的错误检查项中,包含了变量是否赋值(即一个变量是否为空),判断变量为空方法如下: 1.变量通过" "引号引起来 #!/bin/sh para1= if ...
    99+
    2022-06-04
    shell 变量
  • spring注解识别一个接口的多个实现类方法
    1.比如有一个接口如下:public interface Filter { public String doFilter(String param); }...
    99+
    2023-05-31
    spring 注解 接口
  • 判断一个变量是数组Array类型的方法
    在很多时候,我们都需要对一个变量进行数组类型的判断。JavaScript中如何判断一个变量是数组Array类型呢我最近研究了一下,并分享给大家,希望能对大家有所帮助。 JavaScr...
    99+
    2022-11-15
    判断变量 数组Array类型
  • python多个进程间调用变量的方法是什么
    在Python中,多个进程之间可以通过以下几种方法共享变量:1. 使用共享内存(Shared Memory):通过使用共享内存,多个...
    99+
    2023-09-29
    python
  • javascript怎么定义一个方法
    这篇文章主要介绍了javascript怎么定义一个方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。定义方法的方式:1、定义式,先定义方法再调用,语法“function 函数...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作