python 装饰器详解与应用范例
作者:不侠居 发布时间:2022-03-18 01:06:55
标签:python,装饰器
什么是装饰器
从字面意思上来看,装饰器是用来装饰其他东西的工具。在python中装饰器分为函数装饰器和类装饰器。
简而言之,函数装饰器是用来装饰函数的装饰器,其主要目的是增加目标函数的功能,类装饰器也就是装饰类的装饰器,增加类的功能。
函数装饰器
装饰器本质是嵌套函数
下面是一个简单的装饰器
# fun1为装饰器名称,function指的是被装饰的函数
def fun1(function):
def fun2():
print("开始了!")
function() # 执行被装饰的函数或者 或者 return function()
return fun2
外面的fun1()
需要传入一个参数,这个参数是用来传入要被装饰的函数,里面的fun2()
需要执行function
这个参数。
这是将函数当成参数传入另一个函数。
使用方法:
在需要装饰的函数上添加@装饰器名称
@fun1
def fun3():
print("aaa")
fun3()
可以等价成这样:
def fun3():
print("aaa")
fun = fun1(fun3)
fun()
输出结果是一致的
执行结果:
开始了!
aaa
如果传入的函数需要参数可以这样写:
def fun1(function):
def fun2(a):
print("开始了!")
function(a)
return fun2
@fun1
def fun3(a):
print(a)
fun3("aaa")
输出结果:
开始了!
aaa
如果不清楚传入的函数需要多少个参数,可以这样写:
def fun1(function):
def fun2(*args, **kwargs):
print("开始了!")
function(*args, **kwargs)
return fun2
@fun1
def fun3(a,b):
print(a,b)
@fun1
def fun4(a,b,c):
print(a,b,c)
fun3("aaa","bbb")
fun4("ccc","ddd","eee")
运行结果:
开始了!
aaa bbb
开始了!
ccc ddd eee
如果函数装饰器需要添加参数,可以这样写:
def fun(msg):
def fun1(function):
def fun2(*args, **kwargs):
print("开始了!{}".format(msg))
function(*args, **kwargs)
return fun2
return fun1
@fun(msg="小朋友")
def fun3(a,b):
print(a,b)
fun3("aaa","bbb")
运行结果:
开始了!小朋友
aaa bbb
类装饰器
类装饰器的用法基本和函数装饰器一样,只不过是用类写的装饰器
class fun1(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print(("开始了!")
self.func(*args, **kwargs)
@fun1
def fun2(a,b):
print(a,b)
fun2("aaa","bbb")
类装饰用到了类的__call__
方法
运行结果:
开始了!
aaa bbb
还可以这样写:
class fun(object):
def __init__(self, msg):
self.msg = msg
def __call__(self, func):
def fun1(*args, **kwargs):
print("开始了!{0}".format(self.msg))
func(*args, **kwargs)
return fun1
@fun(msg="小朋友")
def fun2(a, b):
print(a, b)
fun2("aaa,","bbb")
运行结果:
开始了!小朋友
aaa, bbb
来源:https://blog.csdn.net/m0_46778548/article/details/121011882
0
投稿
猜你喜欢
- 写在之前首先是写在之前的一些建议:首先是关于这本书,我真的认为他是将神经网络里非常棒的一本书,但你也需要注意,如果你真的想自己动手去实现,那
- model.py:#!/usr/bin/python# -*- coding: utf-8 -*-import torchfrom torc
- 简单的模型例如线性回归,LR等模型非常易于解释,但在实际应用中的效果却远远低于复杂的梯度提升树模型以及神经网络等模型。现在大部分互联网公司的
- 对于yolo系列,应用广泛,在win10端也有很大的应用需求,所以这篇文章给出win10环境下的安装教程。先给出系列文章win10+anac
- 安装 SQL2000 时,系统经常会提示:操作被挂起,要求重新启动计算机,如图1: 图1重新启动后,再次安装时问题仍然存在。解决办
- 笔者日积月累了许多精彩、实用的Web特效的制作,这些特效几乎都是比较常用的网页特效。现在我就把这些经过
- 如下所示:两个函数:Basemap.drawparallels ##纬度 Basemap.drawmeridia
- 本文实例为大家分享了python实现分页效果展示的具体代码,供大家参考,具体内容如下难点:清空Layout#!/usr/bin/python
- 本文实例讲述了php使用Cookie实现和用户会话的方法。分享给大家供大家参考。具体分析如下:PHP 包含了很多的函数,可以用来管理和记录用
- 临近下班的时候,突然想到统计热门文章的问题。以前我所知道的热门文章统计,基本有这么几种:按点击数排序 该方法最大的问题在于热门的文章会越来越
- 无水印视频下载方法一:无水印视频下载很简单,有一个通用的方法,就是使用去水印平台即可。我使用的去水印平台是:http://douyin.ii
- 看例子:运行代码框<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transiti
- 在Web开发的时候,经常会遇到的一种情况就是浏览器提示脚本运行时间过长,停止还是继续,无论你选择什么,相信你都会想尽一切办法让这个对话框远离
- 本文为大家分享了python实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下Github:Tetris代码:# -*- coding:
- 这学期有一门运筹学,讲的两大块儿:线性优化和非线性优化问题。在非线性优化问题这里涉及到拉格朗日乘子法,经常要算一些非常变态的线性方程,于是我
- 我们可以利用err对象来判断。当程序没有出现错误就说明已经执行了sql操作: sql="insert into
- 上一篇介绍了 HTML5 中 Canvas 的基本概念,这篇将要介绍一下 Canvas&n
- 本文为大家分享了pygame游戏之旅的第5篇,供大家参考,具体内容如下在游戏中添加显示文字:这里自己定义一个crash函数接口:def cr
- 虽然有很多种方式可以解决这个问题,但是我们可以用T-SQL代码来处理这个文件删除过程。我用xp_cmdshell命令和FORFILES命令来
- 本篇主要将react全家桶的产品非常精炼的提取了核心内容,精华程度堪比精油。各位大人,既然来了,客官您坐,来人,给客官看茶~~redux前言