首页技术python装饰器,pytest框架详解

python装饰器,pytest框架详解

编程之家2024-03-01107次浏览

一、python装饰器原理详解

Python装饰器原理详解Python装饰器是一种用于增强函数或类功能的语法结构。

python装饰器,pytest框架详解

其原理可以通过以下解释来理解:1.装饰器的存在是为了实现函数或类的功能增强,通常是在不修改原函数或类代码的情况下进行扩展和增加新功能。

2.装饰器是通过在代码中声明一个装饰器函数来实现的,该函数接受一个目标函数作为参数,并返回一个经过装饰后的新函数。

3.装饰器函数可以在目标函数执行前后执行其他逻辑,如打印日志、计时等,从而实现对目标函数功能的增强。

4.装饰器可以通过使用Python的语法糖@来应用于目标函数,使得代码更加简洁易读。

5.装饰器可以应用于函数或类的定义上,可以使用多个装饰器对同一个函数或类进行装饰。

6.装饰器的本质是闭包,即一个能够访问外部函数作用域中变量的函数。

python装饰器,pytest框架详解

通过使用装饰器,我们可以灵活地扩展函数或类的功能,使得代码更加模块化、可重用和易于维护。

二、python中如何理解装饰器代码

长文预警,【最浅显易懂的装饰器讲解】

能不能专业地复制题目?配上代码,问题分段。

我来给提主配上问题的代码。

正式回答:

1:如何理解return一个函数,它与return一个值得用法区别在哪?

python装饰器,pytest框架详解

敲黑板,"python中,一切都是对象"。

值是对象,函数也是对象。

上图,num是int类的实例对象,funcobj是function类的一个实例对象。

所以返回一个值和返回一个函数并没有什么不同,本质都是返回一个对象。

但是由于值类型和函数类型的使用方法不同,值直接使用,函数需要加上()调用。

2.在wrapper函数中,为什么能返回一个在wrapper函数中没有定义的func函数?

先更正你的提问,wrapper函数并没有返回func函数,而是返回func函数的运行结果。

因此,作为参数传递给wrapper函数之后,wrapper当然可以调用func函数。

3.怎么理解在log中作为参数存在的func,在wrapper函数中成了函数?

相信你已经明白用对象的眼光看待,因此和问题2其实是一个问题。

4.这对log函数本身的使用有哪些影响,或者说当A函数的参数是一个函数时,如何使用A函数?

什么是装饰器?装饰器就是装饰函数的!

问题图中的log函数就是为了在不更改func的情况下,每次调用func之前,都会执行

想到了什么?日志!没错!

那么,你可能会问,为什么不在func函数print日志呢?

问得实在太好了!

1:如果func函数是你写的,那么你当然可以这么做;如果不是你写的,你这么做试试?

比如在系统open函数的最前面加上print()....

2:如果你有n个函数,在执行的前后都会执行一些类似的代码。

以下是2个不同的写法

显然右边代码量更少,更容易维护,但是还有更好的写法。

请注意,不修改add函数和sub函数的情况下,就为这2个不同的函数的执行前后增加了新的功能。

把add函数和sub函数装饰得更强大了。

上述代码后半段仍有改进的空间。

看,经过@decorator装饰add和sub函数之后,使用时更方便了。

细心的朋友,相信已经注意到了add函数和sub函数的参数不一样的。

没有错,我是故意的。

奥妙在于*args和**kwgs,可变参数。

上图是对指定参数、可变参数*args、可变**kwgs的示例。

对于装饰器来说,不需要指定参数,因此只需*args和**kwgs即可以表示。

如果对你有帮助,请点赞支持。

三、怎么理解Python的装饰器

关于你的疑惑,我给你做以下总结,希望对你有帮助

理解Python装饰器(Decorator)

Python装饰器看起来类似Java中的注解,然鹅和注解并不相同,不过同样能够实现面向切面编程。

想要理解Python中的装饰器,不得不先理解闭包(closure)这一概念。

闭包

看看维基百科中的解释:

在计算机科学中,闭包(英语:Closure),又称词法闭包(LexicalClosure)或函数闭包(functionclosures),是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。

官方的解释总是不说人话,but--talkischeap,showmethecode:

是一个局部变量,在函数执行之后应该就不会存在了。但是嵌套函数引用了这个变量,将这个局部变量封闭在了嵌套函数中,这样就形成了一个闭包。

结合这个例子再看维基百科的解释,就清晰明了多了。闭包就是引用了自有变量的函数,这个函数保存了执行的上下文,可以脱离原本的作用域独立存在。

下面来看看Python中的装饰器。

装饰器

一个普通的装饰器一般是这样:

这样就定义了一个打印出方法名及其参数的装饰器。

调用之:

输出:

装饰器在使用时,用了语法,让人有些困扰。其实,装饰器只是个方法,与下面的调用方式没有区别:

语法只是将函数传入装饰器函数,并无神奇之处。

值得注意的是,这是python提供的装饰器。它能把原函数的元信息拷贝到装饰器里面的func函数中。函数的元信息包括docstring、name、参数列表等等。可以尝试去除,你会发现的输出变成了wrapper。

带参数的装饰器

装饰器允许传入参数,一个携带了参数的装饰器将有三层函数,如下所示:

看到这个代码是不是又有些疑问,内层的decorator函数的参数func是怎么传进去的?和上面一般的装饰器不大一样啊。

其实道理是一样的,将其语法去除,恢复函数调用的形式一看就明白了:

输出结果与正常使用装饰器相同:

至此,装饰器这个有点费解的特性也没什么神秘了。

装饰器这一语法体现了Python中函数是第一公民,函数是对象、是变量,可以作为参数、可以是返回值,非常的灵活与强大。

玩3d游戏电脑配置(如何配置电脑才能玩3d游戏)地址管理(ip地址管理工具)