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

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

(0)

相关推荐

  • Python 装饰器代码解析

    前言: 以往看到我博客的小伙伴可能都知道,我的前言一般都是吐槽和讲废话环节,哈哈哈哈.今天难得休息,最近可真是太忙了,博主已经连续一年都在996了,所以最近没怎么学习新东西,只能回顾以往的旧知识了,上周一起工作的小伙伴扛不住996离职了,我们三人的小团队也正式解散了,哎.原本想着找时间好好整理一个关于关于接口自动化测试或ceph相关的东西.但由于篇幅过长这里目前可能不会着手写这方面东西.其实啊写是很简单的,主要例子难找.哈哈哈哈. 好了回归正题吧.看过我以往博客的小伙伴肯定见我用过@parame

  • Python装饰器的两种使用心得

    装饰器的基础使用(装饰带参函数) def decorator(func): def inner(info): print('inner') func(info) return inner @decorator def show_info(info): print(info) show_info('hello') 防止装饰器改变装饰函数名称 装饰器在装饰函数的时候由于返回的是inner的函数地址,所以函数的名称也会改变 show_info.__name__会变成inner,防止这种现象可以使用fu

  • python装饰器原理源码示例分析

    目录 前言 一.什么是装饰器 二.为什么要用装饰器 三.简单的装饰器 四.装饰器的语法糖 五.装饰器传参 六.带参数的装饰器 七.类装饰器 八.带参数的类装饰器 九.装饰器的顺序 前言 最近有人问我装饰器是什么,我就跟他说,其实就是装饰器就是类似于女孩子的发卡.你喜欢的一个女孩子,她可以有很多个发卡,而当她戴上不同的发卡,她的头顶上就是装饰了不同的发卡.但是你喜欢的女孩子还是你喜欢的女孩子.如果还觉得不理解的话,装饰器就是咱们的手机壳,你尽管套上了手机壳,但并不影响你的手机功能,可你的手机还是该

  • Python中装饰器的基本功能理解

    目录 前言 什么是装饰器 Python 函数的基本特性 函数名的本质: 将函数作为变量使用: 进一步实现装饰器 使用Python装饰器语句: 总结 前言 在 python 中,装饰器由于是 python 语言自带的一个功能,因此,对于其实现以及其用法就会感到比较奇怪,这里我记录一下对它的理解,加深自己的印象. 什么是装饰器 对于什么是装饰器,我们其实应该知道为什么会存在装饰器. ​ 装饰器是 python 引入的一个非常有意思的功能,它主要用于解决想要在原有函数或类的基础上进行功能扩展,但又不会

  • Python装饰器与线程结合提高接口访问效率方法

    回顾装饰器的基本用法 装饰器的本质是闭包,是python的一种语法糖 def outer(fun): def inner(*args,**kwargs): return fun(*args,**kwargs) return inner # 使用装饰器装饰一下两个函数 @outer def num1(): print('a') @outer def num2(): print('b') if __name__ == '__main__': print(num1.__name__) print(nu

  • Python装饰器代码详解

    目录 一.理解装饰器 二.装饰器原型 1.不带参数的装饰器 2.带参数的被装饰的函数 3.带参数的装饰器 4.使用类作为装饰器 5.使用对象作为装饰器 6.多层装饰器的嵌套 总结 一.理解装饰器 所有东西都是对象(函数可以当做对象传递) 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. def function_one(): print("测试函数") #可以将一个函数赋值给一个变量,比如 foo =function_one #这里没有在使用小括号,因

  • Python装饰器详情

    目录 1.装饰器 1.1 应用场景 2.万能装饰器 3.多层装饰器 4.带参数的装饰器 1.装饰器 装饰器(Decorator):从字面上理解,就是装饰对象的器件.可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出. 装饰器的特点是特点是函数是作为其参数出现的,装饰器还拥有闭包的特点. 示例代码如下所示: # 定义一个装饰器 def decorate(func): def wrapper(): func() print("已将学生加入学校学生名单")

  • Python 函数装饰器详解

    目录 使用场景 授权(Authorization) 日志(Logging) 带参数的装饰器 在函数中嵌入装饰器 装饰器类 总结 装饰器(Decorators)是 Python 的一个重要部分.简单地说:他们是修改其他函数的功能的函数.他们有助于让我们的代码更简短,也更Pythonic(Python范儿).大多数初学者不知道在哪儿使用它们,所以我将要分享下,哪些区域里装饰器可以让你的代码更简洁.首先,让我们讨论下如何写你自己的装饰器. 这可能是最难掌握的概念之一.我们会每次只讨论一个步骤,这样你能

  • python 装饰器详解与应用范例

    什么是装饰器 从字面意思上来看,装饰器是用来装饰其他东西的工具.在python中装饰器分为函数装饰器和类装饰器. 简而言之,函数装饰器是用来装饰函数的装饰器,其主要目的是增加目标函数的功能,类装饰器也就是装饰类的装饰器,增加类的功能. 函数装饰器 装饰器本质是嵌套函数 下面是一个简单的装饰器 # fun1为装饰器名称,function指的是被装饰的函数 def fun1(function): def fun2(): print("开始了!") function() # 执行被装饰的函数

  • 两个很实用的Python装饰器详解

    目录 1.超时函数 2.Trace函数 总结 1.超时函数 这个函数的作用在于可以给任意可能会hang住的函数添加超时功能,这个功能在编写外部API调用 .网络爬虫.数据库查询的时候特别有用 timeout装饰器的代码如下: import signal,functools #下面会用到的两个库 class TimeoutError(Exception): pass #定义一个Exception,后面超时抛出 def timeout(seconds, error_message = 'Functi

  • Python 3.7新功能之dataclass装饰器详解

    前言 Python 3.7 将于今年夏天发布,Python 3.7 中将会有许多新东西: 各种字符集的改进 对注释的推迟评估 以及对dataclass的支持 最激动人心的新功能之一是 dataclass 装饰器. 什么是 Data Class 大多数 Python 开发人员编写过很多像下面这样的类: class MyClass: def __init__(self, var_a, var_b): self.var_a = var_a self.var_b = var_b dataclass 可以

  • python高级语法之闭包和装饰器详解

    一.闭包 闭包的形成条件: 1.函数嵌套. 2.内部函数使用了外部函数的变量或者参数. 3.外部函数返回了使用外 部变量的内部函数. 二.一个简单的例子 def func_out(num1): def inner(num2): res = num1 + num2 print(res) return inner # a = func_out(10)(10) a = func_out(10) a(10) 闭包修改外部函数的变量: 在闭包内修改外部函数的变量需要使用nonlocal关键字 def fu

  • python基础之装饰器详解

    一.前言 装饰器:本质就是函数,功能是为其他函数添加附加功能 原则: 1.不修改被修饰函数的源代码 2.不修改被修饰函数的调用方式 装饰器 = 高阶函数 + 函数嵌套 + 闭包 二.高阶函数 高阶函数定义: 1.函数接收的参数是一个函数 2.函数的返回值是一个函数名 3.满足上述条件任意一个,都可以称为高阶函数 test 函数是高阶函数,接受了一个foo 作为参数 import time def foo(): time.sleep(3) print("sleep 3s") def te

  • python中的迭代器,生成器与装饰器详解

    目录 迭代器 生成器 装饰器 总结 迭代器 每一个可迭代类内部都要实现__iter__()方法,返回一个迭代类对象,迭代类对象则定义了这个可迭代类如何迭代. for循环调用list本质上是是调用了list的迭代器进行迭代. # 对list进行for循环本质上是调用了list的迭代器 list = [1,2,3,4] # for 循环调用 for elem in list: print(elem) # 迭代器调用 list_iter = list.__iter__() while True: tr

  • Python学习之装饰器与类的装饰器详解

    目录 装饰器 装饰器的定义 装饰器的用法 类中的装饰器 类的装饰器-classmethod 类的装饰器-staticmethod 类的装饰器-property 通过学习装饰器可以让我们更好更灵活的使用函数,通过学会使用装饰器还可以让我们的代码更加优雅. 在我们的实际工作中,很多场景都会用到装饰器,比如记录一些日志.或者屏蔽一些不太合法的程序执行从而使我们的代码更加安全. 装饰器 什么是装饰器?虽然对这个次感到陌生,但是完全不需要担心. 首先,装饰器也是一种函数:只不过装饰器可以接收 函数 作为参

  • python 函数的详解与应用范例

    目录 如何定义一个函数 如何使用 什么是参数 不定长参数 return是干什么 如何定义一个函数 函数也称方法,下面写一个简单的函数: def function(): print("我是函数.") 这是一个很简单的函数,函数只干了一件事,打印输出"我是函数."这句话. 从这个函数的外观看,有个def,还有个function加个()和:. def是定义函数的关键字不能改动,function为函数的名称,可以随便写,后加()和:这是规定. 在函数里面的输出语句可以称之为

  • python中的装饰器详解

    在了解装饰器的之前一定要先了解函数作为参数传递, 什么是函数内嵌,请参考我之前写的博客函数简介 因为在python里面,函数也是对象,也可以作为参数进行传递.python装饰器本质也是一种特殊函数,它接收的参数是函数对象,然后动态地函数参数添加额外的功能,而不用修改原有的函数对象.python装饰器传入的参数是函数,返回的值也是函数! python装饰器思想有点类似设计模式的装饰模式, 其意图是动态地给函数对象添加额外的功能.比如像增加日志打印的功能,有点面向切面编程(AOP)的感觉. 装饰器语

  • Python中的各种装饰器详解

    Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: 复制代码 代码如下: >>> def test(func):     def _test():         print 'Call the function %s().'%func.func_name         return func()     return _test >

随机推荐