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
0
投稿
猜你喜欢
- 简单的一个例子,是以前用Dephi写的,前不久刚实现了一个在Python中使用Delphi控件来编写界面程序,于是趁热写一个类似的的查询方案
- Index.asp:程序代码<html><head><meta http-equiv="Conten
- python中安装包的方式有很多种:源码包:python setup.py install在线安装:pip install 包名(linux
- 注:此功能依赖GD2图形库最近要用php生成缩略图,在网上找了一下,发现了这篇文章:PHP生成图片缩略图试用了一下后,发现有这样几个问题:1
- 在实际的项目中,我们一般都会建立三个环境:开发、测试和生产环境,这三种环境会使用不同的配置组合,为了能方便地切换配置,我们可以为不同的环境创
- 当然,页面最好不要刷新,但是,拷贝一下浏览器的链接,又希望是下次能定位到你播发的那个视频。方法很简单,改变一下 url 的 fragment
- 在你的程序初始化时使用如下代码: <?php $Php2Html_FileUrl = $_SERVER["REQU
- Oracle :NvlNVL函数:NVL函数是将NULL值的字段转换成默认字段输出。NVL(expr1,expr2)expr1,需要转换的字
- skimage包的exposure模块图像亮度与对比度的调整,是放在skimage包的exposure模块里面1、gamma调整对原图像的像
- 本文实例讲述了PHP封装cURL工具类。分享给大家供大家参考,具体如下:CurlUtils工具类:<?php/** * cURL请求工
- 本文实例讲述了Python实现获取前100组勾股数的方法。分享给大家供大家参考,具体如下:本来想采用穷举试探的方式来做这个算法,后来发现还是
- SQLSTATESQL SERVER 驱动程序错误描述 HY000所有绑定列都是只读的。必须是可升级的列,以使用 SQLSetPos 或 S
- 本文实例讲述了微信小程序实现图片上传、删除和预览功能的方法。分享给大家供大家参考,具体如下:这里主要介绍一下微信小程序的图片上传图片删除和图
- 阅读上一章:打印样式Chapter 12 CSS布局本书到此为止,讨论的主要是页面内部元素,也就是内容,但是大结构怎么办?长久以来,设计者都
- 前言前段时间我有个朋友看到一些小姐姐的照片,想全部下载下来,叫我帮个忙。于是花费了半天给他全部下载了下来。引入库import timeimp
- 知识点:字符串在编程里,用的最多的就是字符串,字符串同时也是各类数据的中转站字符串运算符:编号运算符类型说明1+字符串拼接2*同一字符串多次
- 摘要:本文介绍了字符与编码的发展过程,相关概念的正确理解。举例说明了一些实际应用中,编码的实现方法。然后,本文讲述了通常对字符与编码的几种误
- 求3721,163,1,4832,1980,2008,68686688,9999,17173,5173,8848中最大的数明白后,试着求一下
- 本文实例讲述了django框架model orM使用字典作为参数,保存数据的方法。分享给大家供大家参考,具体如下:假设有一个字典,里面已经有
- 一、分屏展示当你想同时看到多个文件的时候:右击标签页;选择 move right 或者 split vertical;效果:二、远程 Pyt