python 装饰器详解与应用范例

 更新时间:2021年11月09日 09:50:21   作者:不侠居  
装饰器是 Python 的一个重要部分。简单地说:他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短,也更Pythonic。大多数初学者不知道在哪儿使用它们,所以我将要分享下,哪些区域里装饰器可以让你的代码更简洁。 首先,让我们讨论下如何写你自己的装饰器

什么是装饰器

从字面意思上来看,装饰器是用来装饰其他东西的工具。在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

到此这篇关于python 装饰器详解与应用范例的文章就介绍到这了,更多相关python 装饰器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python3.8.1+selenium实现登录滑块验证功能

    python3.8.1+selenium实现登录滑块验证功能

    这篇文章主要介绍了python3.8.1+selenium解决登录滑块验证的问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 图像检索之基于vlfeat实现SIFT特征

    图像检索之基于vlfeat实现SIFT特征

    SIFT特征的讲解已经很多了,本文就借助vlfeat对SIFT特征的提取过程做一个总结。接下来通过本文给大家介绍图像检索之基于vlfeat实现SIFT,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • pytorch实现模型剪枝的操作方法

    pytorch实现模型剪枝的操作方法

    PyTorch 提供了内置剪枝 API ,也支持了一些非结构化和结构化剪枝方法,但是 API 比较混乱,对应文档描述也不清晰,所以后面我还会结合微软的开源 nni 工具来实现模型剪枝功能,这篇文章主要介绍了pytorch实现模型剪枝, 需要的朋友可以参考下
    2023-02-02
  • 使用python实现http及ftp服务进行数据传输的方法

    使用python实现http及ftp服务进行数据传输的方法

    今天小编就为大家分享一篇使用python实现http及ftp服务进行数据传输的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • python实现车辆跟随滑模控制的实例

    python实现车辆跟随滑模控制的实例

    这篇文章主要介绍了python实现车辆跟随滑模控制,采用指数趋近律、等速趋近律、准滑模控制的方法完成车辆跟随问题的仿真,运行结果以图片形式保存在同目录下,需要的朋友可以参考下
    2022-05-05
  • python函数装饰器构造和参数传递

    python函数装饰器构造和参数传递

    这篇文章主要介绍了python函数装饰器构造和参数传递,下面通过一个小案例来简单的理解什么是装饰器,需要的小伙伴可以参考一下
    2022-03-03
  • 关于tensorflow softmax函数用法解析

    关于tensorflow softmax函数用法解析

    这篇文章主要介绍了关于tensorflow softmax函数用法解析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python 基于PYMYSQL使用MYSQL数据库

    python 基于PYMYSQL使用MYSQL数据库

    这篇文章主要介绍了python 基于PYMYSQL使用MYSQL数据库的方法,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-12-12
  • Python 实现数据库更新脚本的生成方法

    Python 实现数据库更新脚本的生成方法

    下面小编就为大家带来一篇Python 实现数据库更新脚本的生成方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 使用Python实现汉诺塔问题示例

    使用Python实现汉诺塔问题示例

    这篇文章主要介绍了使用Python实现汉诺塔问题示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04

最新评论