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

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

2023-06-16 16:06:01 243人浏览 独家记忆

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

摘要

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

本篇内容主要讲解“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怎么将一个类方法变为多个方法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

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

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

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

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

  • 微信公众号

  • 商务合作