python函数装饰器

Python 使用装饰器 decorator 修改函数行为 在 Python 中,装饰器是一种特殊的高阶函数,它使开发者能够在现有函数(或方法)中添加新功能,而无需添加或更改函数中的任何内容。标准装饰器是一个函数,它接受一个函数作为实参,返回一个内部函数,执行装饰工作。在一个函数上,可以使用多个装饰器,这可以通过链接装饰器实现。值得一提的是,装饰器在简化代码和以简洁的方式添加行为方面非常有用,但其代价是在执行过程中产生额外的开销。我们在调试程序的时候,需要更详细的函数调用信息,然而,使用了装饰器后,当我们在被装饰的函数上调用。装饰器,它返回了一个内部函数。 阅读详情

1、定义:装饰器,就是把一个函数当作参数,返回一个替代版的函数
本质上就是一个返回函数的函数
2、作用:在不改变原函数的基础上给函数增加功能
3、装饰器
如:

def outer(func):  					##()中是要装饰的函数,此函数名和任意,即参数
    def inner():					##定义的要装饰的内容的函数
        print('*********')			##要装饰的内容
        func()    					##运行要装饰的函数
    return inner()  			    ##返回inner,就是返回装饰后的函数

@outer  						    ##语法糖 (在不用改变原函数的情况下,修改函数的输出结果)
def shuchu():
    print('wa ha ha')
@outer
def lizi():
    print('hello world')

例子:

def outer(func):
    def inner(age):
        if age<0:
            age = 0
        else:
            age= age
        func(age)
	return inner

	@outer
	def say(age):
	    print('name is %d years old' %(age))
	
	say(10)
	say(-10)

例子:

	def desc(fun):
def add_info():
    print('节日快乐')
    fun()
    print('下次来玩')
return add_info
@desc
def login():
    print('login...')
login()

例子,装饰器实现函数计时器

import random
		import string
		import time   				  ##导入计时器模块
		import functools   			  ##导入对装饰器装饰的模块
		li = [random.choice(string.ascii_letters)for i in range(100)]
		
		def timeit(fun):          	    ##括号中即要装饰的函数参数,可随意,但在装饰器中必须统一
		    @functools.wraps(fun)       ##对装饰器进行装饰,保留被装饰函数的函数名和帮助信息文档
		    def wapper(*args,**kwargs):     ##args是指元组,kwarges是字典,因为输入的值不一定是那种类型
		        start_time = time.time()    ##开始时间
		        res= fun(*args,**kwargs)    ##执行函数,当被装饰的函数有返回值时,需要对返回值进行接收
		        end_time = time.time()      ##结束时间
		        print('运行时间为: %.6f' %(end_time - start_time))
		        return res                      ##对接收的返回值进行返回
		    return wapper       				##返回wapper函数,即装饰后的函数
		@timeit
		def con_add():
		    s =''
		    for i in li:
		        s+=(i+',')
		    print(s)
		#con_add()
		
		@timeit
		def join_add():
		    print(','.join(li))
		#join_add()
		
		@timeit
		def fun_list(n):
		    """这是fun_list函数,被itemit装饰"""
		    return [2 * i for i in range(n)]
		
		@timeit
		def fun_map(n):
		    """这是fun_map函数,被timeit装饰"""
		    return list(map(lambda x:x*2,range(n)))
		print(fun_list.__name__)        ##显示函数名
		print(fun_list.__doc__)         ##显示函数文档
		print(fun_map.__name__)
		print(fun_map.__doc__)

例子: 创建装饰器, 要求如下:

创建add_log装饰器, 被装饰的函数打印日志信息;

日志格式为: [字符串时间] 函数名: xxx, 运行时间:xxx, 运行返回值结果:xxx

import time
import functools
#print(time.ctime())         ##显示字符串时间time.ctime()
def add_log(fun):
    @functools.wraps(fun)
    def wapper(*args, **kwargs):
        start_time = time.time()
        res = fun(*args, **kwargs)
        end_time = time.time()
        print('[%s] 函数名: %s  运行时间: %.6f 运行返回值结果: %s' % (time.ctime(), fun.__name__, end_time - start_time, res))
        return res
    return wapper

@add_log
def fun_list(n):
    return [2 * i for i in range(n)]
fun_list(5)

4、多个装饰器时候,是自上到下执行的

		def wang_a(fun):
		    def inner_a(*args,**kwargs):
		        print('A')
		        return fun(*args,**kwargs)
		    return inner_a
		
		def wang_b(fun):
		    def inner_b(*args,**kwargs):
		        print('B')
		        return fun(*args,**kwargs)
		    return inner_b
		
		
		@wang_b
		@wang_a
		def f(x):
		    print('wanghaha')
		    return x*2
		f(1)
输出结果先B 后A 

5、多个装饰器的应用场景:会采用多个装饰器先验证是否登陆成功,再验证权限是否足够
import functools
import inspect ##导入模块,可以生成一个字典
def is_admin(fun): ##判断权限
@functools.wraps(fun)
def wapper(*args,**kwargs):
inspect_res =inspect.getcallargs(fun,*args,**kwargs) ##inspect.getcallargs会返回一个字典,key值是形参value值是对应的实参

print(‘inspect的返回值是: %s’ %(inspect_res))

if inspect_res.get('name') == 'root':
    temp = fun(*args,**kwargs)
    return temp
else:
    print('not root user,no permission add student')
return wapper

login_session = ['root','admin','redhat']                       ##判断登陆
def is_login(fun):
    @functools.wraps(fun)
    def wapper(*args,**kwargs):
        if args[0] in login_session:
            temp = fun(*args,**kwargs)
            return temp
        else:
            print('Error: %s未登陆' %(args[0]))
    return wapper

@is_login
@is_admin
def add_student(name):
    print('please input student information:')

add_student('root')
Python函数的函数——装饰器 在 Python 中,装饰器是一种设计模式,用于在不修改原有函数代码的情况下,给函数添加新的功能。装饰器本质上是一个函数,它接收一个函数作为参数,返回一个新的函数。 阅读详情

相关推荐

【Python函数式编程】——装饰器

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值 也是一个函数对象。它经常用于有以下场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景,装饰器是解决这类问题的绝佳设计。

Python全栈系列 2万+

python 函数进阶-闭包函数

闭包函数 什么是闭包函数 如果内函数使用了外函数的局部变量,并且外函数把内函数返回出来的过程叫做闭包,里面的内函数是闭包函数。 # 外函数 outer def outer(): # 外函数变量 num var = '外函数局部变量' # 内函数 inner def inner(): # 内函数使用了外函数的变量 num print('内函数使用了:' + var) # 外函数将使用了外函数的局部变量的内函数返回 return inner # 返回出的结果就是内函数 inner,现在

小可爱的博客 2360

BCM-BCP-DRP-运维管理之故障管理——故障的分类与处理流程

ITSM Business Continuity Manage(BCM) BusinessContinuityPlan(BCP) 偏业务 DisasterRecoveryPlan(DRP) 偏IT 天塌了,考虑在天塌了的状态下做什么,怎么开展业务就是BCP; 天塌了,考虑怎么把天撑回去,就是DRP。 DRP+BCP+供应链管理+危机管理等就是BCM (业务连续性管...

mmgithub123的博客 2722

闭包

文章目录闭包释义(来自百度百科)例子作用缺点 ReactNative系列-文章 闭包 释义(来自百度百科) 闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。 例子 function makeFunc() { var name = &quot;...

覃大畅的博客 699

从零到一:AIC8800 USB-WiFi模块在Linux内核6.x下的驱动适配与避坑指南

本文详细介绍了AIC8800 USB-WiFi模块在Linux内核6.x下的驱动适配全流程,包括环境准备、源码编译、内核API变更处理及常见问题解决方案。重点针对驱动适配中的符号导出、设备ID识别和固件加载等核心挑战提供实用指南,帮助开发者高效完成硬件驱动兼容性调试。

k8l9m0n的博客 1026

GhidrAssist:AI驱动的逆向工程助手实战指南

逆向工程是分析软件内部工作原理、理解二进制代码逻辑的关键技术,广泛应用于软件安全、恶意代码分析和漏洞挖掘等领域。其核心原理在于通过反编译、控制流与数据流分析等手段,将机器码还原为可理解的高级语言表示。传统逆向分析高度依赖人工经验,面对海量代码时效率低下且易出错。随着大语言模型(LLM)技术的发展,其强大的代码理解与推理能力为自动化逆向分析提供了新的可能。通过将LLM与成熟的逆向工程框架(如Ghidra)相结合,可以构建智能辅助系统,实现代码意图的自动解释、变量/函数的智能重命名以及潜在漏洞模式的辅助识别,从

weixin_42547335的博客 596

python全栈开发什么意思_Python全栈开发

一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了。一、装饰器装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),装饰器的功能非常强大,但是理解起来有些困难,因此我尽量用最简单的例子一步步的说明这个原理。1、不带参数的装饰器假设我定义了一个函数f,想要在不改变原来函数定义的情况下,在函数运行前打印出star...

weixin_39814960的博客 198

ubuntu18.04 升级Ubuntu 20.04

Ubuntu 18.04升级20.04指南:首先备份重要数据,更新当前系统并检查新版本可用性(sudo do-release-upgrade -c)。确认升级后执行sudo do-release-upgrade,按提示完成操作。升级过程需耐心等待,完成后重启系统。注意:升级前务必备份数据,确保系统为最新版本,以降低风险。升级后即可使用Ubuntu 20.04系统。

https://ophome.blog.youkuaiyun.com,在IT行业有多年的工作经验,尤其是在Python、Linux、负载均衡、Nginx和服务器运维等领域。 1058

python函数def_python def 函数

函数想改变全局变量需要使用 globala=1def func():global aa+=1func()print(a) //2 不适用global会报错局部变量改变nonlocal 找上层中里它最近一层的局部变量def func2():a=1def func3():nonlocal a //只会找局部变量,全局的不找a+=1func3()print(a) // 2func2()闭包函数...

weixin_39943992的博客 248

如何将 Fiori Elements Object Page Header 工具栏里按钮用 JavaScript 代码设置成禁用状态

本文介绍了如何在SAP Fiori Elements应用中动态控制Object Page工具栏按钮的可用状态。通过UI5 Inspector工具分析发现,这些按钮的enabled属性都双向绑定到/ui/enabled模型字段。在StatusExt.controller.js中,通过获取按钮ID前缀拼接完整控件ID,使用setEnabled(false)方法即可禁用按钮。关键点包括:1)使用extensionAPI获取视图ID前缀;2)注意事件回调中的this上下文绑定;3)通过修改模型字段可同步更新所有绑定

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 372

Q3D提取PCB走线RLCG参数

介绍一种提取PCB走线寄生电容和寄生电感的方法

sinat_15150363的博客 2917

【Python】装饰器函数

以上是装饰器函数的一些基本内容, 要尝试着敲一遍才能理解, 如果第一遍看不懂的话,不要慌, 因为装饰器,闭包函数,*操作符等算是python中的中高级内容了, 我也是学习了好多遍,虽然实际中从没用过,但是学学对于理解pyhton的特性还是很有帮助的, 最后, 希望这篇文章可以帮到你!

享你所想 1603

mediasoup源码分析(二十)服务端架构设计

目录 简介 信令服务(房间服务) 调度服务 媒体服务 简介 流媒体服务器大的方向上可以分为上述三个模块。目前行业内都是分布式服务,独立部署。mediasoup信令与媒体之间虽然可以管道通信。但在行业内,服务之间通过管道通信用的少。 一般是rpc、mq,或者传统的tcp。这块licode架构比较不错,licode是信令和媒体服务通过MQ消息队列解耦。 下面介绍一下这三个服务主要功能,当然文中所说也是一家之言。 信令服务(房间服务) 信令服务也称为房间服务。有的企业把信令和房间分开,信..

lcalqf的专栏 1545

python的装饰器(函数装饰器)

作为许多语言都存在的高级语法之一,装饰器是你必须掌握的知识点。 装饰器(Decorator):从字面上理解,就是装饰对象的器件。可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件或者帮助输出。装饰器有很多种,有函数的装饰器,也有类的装饰器。装饰器在很多语言中的名字也不尽相同,它体现的是设计模式中的装饰模式,强调的是开放封闭原则。装饰器的语法是将@装饰器名,放在被装饰对象上面...

春天的波菜 7294

RV1126笔记二十七:MetaRTC6移植

MetaRTC6移植

6038

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Python装饰器:函数装饰器①

func()我们可以使用")Hello!在这个例子中,是一个装饰器,它接受函数say_hello作为参数,并返回一个新的函数wrapper。当调用say_hello时,实际上调用的是wrapper函数。装饰器是 Python 中一个非常强大的工具,可以用来扩展和修改函数或方法的行为。通过装饰器,我们可以在不修改原始代码的情况下为函数添加额外的功能。在实际开发中,装饰器有很多应用场景,包括日志记录、访问控制、性能优化等。希望本文能够帮助你更好地理解和使用 Python 中的装饰器。

结合项目案例,记录点点滴滴,自己回顾,分享他人o__o 2901

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

python-函数装饰器,类装饰器,属性装饰器

理解装饰器 python中的装饰器看起来类似java中的注解,然而并不相同,Python中装饰器本质是一个函数,只是这个函数可以在不改变别的函数的基础上,增加一些功能,想要理解装饰器,首先了解一下闭包这个概念 闭包 通俗点说,函数A中定义了另外一个函数B,这里A称为外函数,B称为内函数,所谓的闭包就是,内涵数B运用了外函数A定义的变量C,并且外函数的返回值是内函数的引用,这就是闭包,给段代码了解下: def A(number): C= 10 def B(): return int(number) +

m0_47671192的博客 1826

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

python之装饰器,多重装饰器,多层函数装饰器

理解装饰器之前先要理解闭包 闭包 定义:在一个函数内部的函数,同时内部函数又引用了外部函数的变量。 本质:闭包是将内部函数和外部函数的执行环境绑定在一起的对象。 优点:内部函数可以使用外部变量。 缺点:外部变量一直存在于内存中,不会在调用结束后释放,占用内存。 作用:实现python装饰器。 闭包三要素: – 必须有一个内嵌函数。 – 内嵌函数必须引用外部函数中变量。 – 外部函...

weixin_44955304的博客 521

Python函数:装饰器

本章介绍了python函数中的装饰器

2403_86719076的博客 2332

Python之函数装饰器

一、什么是函数装饰器 1.函数装饰器是Python提供的一种增强函数功能的标记函数; 2.装饰器是可调用的函数对象,其参数是另一个函数(被装饰的函数); 我们可以使用修饰器来封装某个函数,从而让程序在执行这个函数之前与执行完这个函数之后,分别运行某些代码。这意味着,调用者传给函数的参数值、函数返回给调用者的值,以及函数抛出的异常,都可以由修饰器访问并修改。这是个很有用的机制,能够确保用户以正确的方式使用函数,也能够用来调试程序或实现函数注册功能,此外还有许多用途。 二、函数装饰器的执行时机 函数装饰器在

无风听海 1796

python函数装饰器和php函数装饰器

python函数装饰器和php函数装饰器 python里面有一类特别有趣的语法糖名叫装饰器(Decorator).也就是给定的特定的语法结构允许对函数进行包装,添加特定的功能. 如果只看名字,可能会觉得和其他面向对象语言中的装饰器模式相似.可以参考装饰器模式(装饰设计模式)详解 装饰器的讨论 装饰器在python3.0之前并不是一个语法糖( syntax candy).一开始,他是因为python的语法特性而被人借用的常见开发方式.原因在于python糅杂了函数式编程的语法.允许吧函数作为参数参数和返回值使

南浦 354

python高阶知识之函数装饰器详解

装饰器(decorator)是函数一种高阶用法,定义时需要满足几个条件:1 函数内定义嵌套函数并返回该函数(这种叫函数闭包)2 将函数作为参数传入这样看来实现也不是很复杂,平常我们也会经常用到装饰器函数,比如类中的@staticmethod,@classmethod,Flask框架中的@app.route()等。

kymppcds的博客 1326

python装饰器函数-python装饰器1:函数装饰器详解

先混个眼熟谁可以作为装饰器(可以将谁编写成装饰器):函数方法实现了__call__的可调用类装饰器可以去装饰谁(谁可以被装饰):函数方法类基础:函数装饰器的表现方式假如你已经定义了一个函数funcA(),在准备定义函数funcB()的时候,如果写成下面的格式:@funcAdef funcB():...表示用函数funcA()装饰函数funcB()。当然,也可以认为是funcA包装函数funcB。它...

weixin_37988176的博客 431

Python 进阶:函数装饰器

本小节主要梳理函数装饰的用法,循序渐进,逐层增加条件,加大复杂度和难度。环境说明:Python 3.6、windows11 64位。

明而决之 3097

python装饰器函数-Python精进-装饰器与函数对象

本文为《爬着学Python》系列第四篇文章。从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新。在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说可能理解起来会有一些障碍。但究其原因,新手之所以觉得装饰器理解起来有困难,是因为对Python对象、函数对象的理解不够深刻。希望本文能够帮助有困惑的新手通过巩固对Python对象的认识来轻松地理解装饰器。废话少说,开...

weixin_37988176的博客 288
上一篇: python生成验证码
下一篇: os模块
Dead_LS
博客等级 码龄7年 6粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值