Python 装饰器代码解析
作者:TORTOISR 发布时间:2022-06-29 20:48:01
标签:Python,装饰器,概念
前言:
以往看到我博客的小伙伴可能都知道,我的前言一般都是吐槽和讲废话环节,哈哈哈哈。今天难得休息,最近可真是太忙了,博主已经连续一年都在996了,所以最近没怎么学习新东西,只能回顾以往的旧知识了,上周一起工作的小伙伴扛不住996离职了,我们三人的小团队也正式解散了,哎。原本想着找时间好好整理一个关于关于接口自动化测试或ceph相关的东西。但由于篇幅过长这里目前可能不会着手写这方面东西。其实啊写是很简单的,主要例子难找。哈哈哈哈。
好了回归正题吧。看过我以往博客的小伙伴肯定见我用过@parameterized.expand()用作参数化的装饰器。这属于系统定义装饰器,当然我们自己也可以自定义装饰器已适合我们日常的开发需求。
**什么是装饰器:**装饰器的本质就是一个函数,作用是在不改变源代码的情况下,给函数增加额外的功能;装饰器的使用通过@语法糖进行调用。
普通装饰器:
直接上代码吧。
def demo(func_test):
def wrapper():
print('定义的第一个装饰器')
func_test()
print('装饰器结束')
return wrapper #这里注意不要加括号
@demo
def func_test():
print('小白小白!!!!')
直接使用自定义装饰器强化的原方法。
带有参数的装饰器:
def demo(func_test):
def wrapper(name):
print('定义的第一个装饰器')
func_test(name)
print('哦,你就是%s啊'%name)
print('装饰器结束')
return wrapper
@demo
def func_test(name):
print('大家好我叫%s'%name)
是不是有点感觉了啊。
接下来就是不带自定义参数的装饰器
def demo(func_test):
def wrapper(*name,**kwargs):
print('定义的第一个装饰器')
func_test(*name,**kwargs)
print('哦,你就是%s啊'%name[0])
print('你今年%s岁啊'%name[1])
print('装饰器结束')
return wrapper
@demo
def func_test(name,age):
print('大家好我叫%s'%name)
print('今年{}'.format(age))
是不是很简答啊。哈哈哈哈
多个装饰一起使用。
def deco01(func):
def wrapper(*args,**kwargs):
print('第一层的装饰器')
func(*args,**kwargs)
print('第一层装饰器结束')
return wrapper
def deco02(func):
def wrapper(*args,**kwargs):
print('这是第二层装饰器')
print('第二层装饰器结束')
func(*args, **kwargs)
return wrapper
@deco02
@deco01
def func(a,b,c,name):
print('hello ,here is a func')
print("result is %d" %(a+b+c))
print('name:{}'.format(name))
看看执行顺序可以看出装饰器是从上往下执行的。
类装饰器:
在使用装饰器时我们总不能在一个文件里写的都是装饰器和各个方法吧,总是要分开的。这里就要是讲一个类装饰器。
这里呢,我大概了写了一个读取文件装饰器的例子。
class Mydecorator():
def __init__(self,func):
# 定义为私有属性
self.func = func
# 实现__call__方法,让对象变成可以调用的对象,可调用的对象可以想函数那样使用
def __call__(self, *args, **kwargs):
print('测试类装饰器')
self.func(*args)
catalogue = args[0]
suffix = catalogue.split('.')[2]
try:
if suffix == 'json':
with open(*args,'r',encoding='utf-8') as file_object:
contents = json.load(file_object)
print(contents)
else:
with open(*args,'r',encoding='utf-8') as file_object:
contents = file_object.read()
print(contents)
except Exception as a:
print('读取文件出错拉:{}'.format(a))
@Mydecorator
def name(name):
print('请输入对应文件路径:%s'%name)
是不是很好用啊。哈哈哈哈
来源:https://blog.csdn.net/HUJIANLAILE/article/details/121065820


猜你喜欢
- 本文讨论 MySQL 的备份和恢复机制,以及如何维护数据表,包括最主要的两种表类型:MyISAM 和 Innodb,文中设计的 MySQL
- 大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引可以提高数据访问效率。为什么索引能提高数据访问性能?他会不会有“副作用”?是不是
- 本文实例分析了python中的全局变量用法。分享给大家供大家参考。具体分析如下:Python是一种面向对象的开发语言,在函数中使用全局变量,
- 使用TensorFlow的一个优势是,它可以维护操作状态和基于反向传播自动地更新模型变量。 TensorFlow通过计算图来更新变量和最小化
- 微信小程序 滚动选择器(时间日期)详解微信小程序自己封装了很多控件,用起来确实很方便,如果这是Android里面,还需要自己去定
- items()方法返回字典的(键,值)元组对的列表语法以下是items()方法的语法:dict.items()参数 &
- QQ邮箱/163邮箱的邮件发送:py文件发送邮件内容相当于一个第三方的客户端,借助于QQ/163邮箱服务器来发送的邮件。主要配置:导入模块—
- 一、背景主流被使用的地理坐标系并不统一,导致我们从不同平台下载的数据由于坐标系的差异往往对不齐。这个现象在多源数据处理的时候往往很常见,因此
- 这篇文章主要介绍了python实现windows桌面截图代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 1,exists和in的理解exists:如果子查询中包括某一行,那么就为TRUE in:如果操作数为TRUE等于表达式列表中的一个,那么就
- pyx文件是python的c扩展文件,代码要符合cython的规范,用什么编辑器写都行。我在eric4上写的,结果它默认用python解释器
- 一,简介退火算法不言而喻,就是钢铁在淬炼过程中失温而成稳定态时的过程,热力学上温度(内能)越高原子态越不稳定,而温度有一个向低温区辐射降温的
- 前面已经提到,CSS之所以如此强大,是因为它采用HTML文档结构来决定其样式的应用。但这仅仅只是一方面,因为它只暗示了CSS之所以使用文档结
- 前言;python由于它动态解释性语言的特性,跑起代码来相比java、c++要慢很多,尤其在做科学计算的时候,十亿百亿级别的运算,让pyth
- 介绍在Python语言中最常见的括号有三种,分别是:小括号()、中括号[]、花括号{};其作用也不相同,分别用来代表不同的Python基本内
- 一个美女面试官坐到我的对面,发光logo的MacBook也挡不住她那圆润可爱的脸庞。程序媛本就稀有,美女面试官更是难寻。这么温柔可爱的面试官
- 相信各位phper在日常开发中,会经常遇到需要合并数组的场景。那么,在php中都有哪一些方法可以用来合并数组呢。第一种,使用&ldq
- 前言最近想做个小玩意,需要在mac端实现屏幕截图,搜了下网上中文资源都比较老旧,于是查了下,发现有些好用的Python库已经支持Mac 以及
- 写出来的效果图就是这样了:下面就更新一下全部的代码吧还是老样子先定义import pygame,sysimport ra
- 系统如下:操作系统 : CentOS7.3.1611_x64Python 版本 : 2.7.5问题描述编码过程中有时候会遇到在多个源文件中存