python3之装饰器
1、装饰器
装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限验证等场景,装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
装饰器的实现原理:
#无参数装饰器原理:
def login(funct):
print('passed user veriftcation...')
return funct #函数返回形参的值或内存地址 def tv():
print('welcom to TV page')
tvv= login(tv) #执行login函数,参数tv返回tv函数的内存地址
tvv() #执行生成器函数将执行tv函数
传参数装饰器原理:
#实例:实现程序执行前的验证
def login(funct): #验证函数
def inner(arg): #嵌套函数是为了不让验证函数不执行
print('passed user veriftcation...')
funct(arg)
return inner #将内嵌函数内存地址返回给login @login #@是装饰器的语法糖,它实际就是等于tv=login(tv)
def tv(name): #执行程序函数
print('welcom %s to TV page' %name) #tv = login(tv) #相当与@login,与装饰器的作用一样
tv('zhang') #执行程序前,通过装饰器验证 #上面程序执行原理说明:
#程序执行后,首先扫描程序内的装饰器(@login)执行后,跳转到装饰器函数
#将函数读取到内存,login将返回inner函数的内存地址,执行tv时,首先执行inner函数,tv参数‘zhang’传递给inner,打印输出,funct参数值为tv,执行funct后就会执行tv函数。理解装饰器原理就是把tv函数包起来执行,先验证后执行。
装饰器下的函数返回值:
def login(funct):
def inner(*args,**kwargs):
print('passed user veriftcation...')
return funct(*args,**kwargs) #inner的返回值就是tv的返回值
return inner #@login
def tv(*args,**kwargs):
print('welcom %s to TV page %s' %(args,kwargs))
return 88 #返回值
tv = login(tv)
dic = {'k1':'v1','k2':'v2'}
li = ['python','java']
t = tv(dic,li)
print(t)
装饰器带传参函数,多层装饰器:
#验证函数
def login(*args,**kwargs):
print('%s登陆验证%s!'%(args,kwargs))
#登陆后操作
def quanxian(*args,**kwargs):
print('%s登陆后操作!%s'%(args,kwargs))
#装饰器
def decorator(login_func,quanxian_func): #传参2个函数
def inner(index_func): #传参登陆函数
def inner2(*args,**kwargs): #接收index的传参
login_func(*args,**kwargs) #执行login函数
index_func(*args,**kwargs) #执行index函数
quanxian_func(*args,**kwargs) #执行quanxian函数
return inner2 #返回函数地址
return inner #返回函数地址
@decorator(login,quanxian) #执行装饰器
def index(*args,**kwargs): #登陆函数
print('登陆后台!%s,%s'%(args,kwargs))
l1 = [1,2,3,4]
dic = {'k1':'v1','k2':'v2'}
index(l1,dic) #执行函数
python3之装饰器的更多相关文章
- (转)Python3.5——装饰器及应用详解
原文:https://blog.csdn.net/loveliuzz/article/details/77853346 Python3.5——装饰器及应用详解(下)----https://blog.c ...
- python3.7 装饰器
#!/usr/bin/env python __author__ = "lrtao2010" #python3.7 装饰器 #装饰器 ''' 定义:本质就是一个函数,作用是为其他函 ...
- python3练习-装饰器
在廖雪峰的官方网站学习装饰器章节时,初步理解类似与面向切面编程.记录一下自己的课后习题解法. 问题: 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call ...
- Python3.5:装饰器的使用
在Python里面函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数,简单来说函数也是变量也可以作文函数的参数 >>> def funA(): ... pr ...
- python3之装饰器修复技术@wraps
普通函数 def f(): """ 这是一个用来测试装饰器修复技术的函数 """ print("哈哈哈") if __n ...
- Python3中装饰器的使用
较为复杂的装饰器使用: user,passwd = 'hjc',111111 def auth(type): print('auth type:',type) def outwrapper(func) ...
- python3 使用装饰器,及函数作为参数
#装饰import typesdef shucai(n): print('蔬菜价格7') if type(n)==types.FunctionType: return n()+7 return n+7 ...
- 【python3】装饰器
参考文章: 理解Python装饰器(Decorator) 关键点: 写装饰器一定要搞定楚函数名后面带小括号和不带小括号的含义.带小括号,表示调用这个函数,而不带小括号,则表示的是该函数引用地址 简单装 ...
- python3中装饰器的用法总结
装饰器预备知识点 1 函数赋值给一个变量 函数名可以像普通变量一样赋值给另一个变量. def test(): print("i am just a test function") ...
随机推荐
- LeetCode139:Word Break
Given a string s and a dictionary of words dict, determine if s can be segmented into a space-separa ...
- ORACLE-015:ora-25153 暂时表空间为空,ora01652 无法通过128
写了一个复杂的select语句,突然oracle就报了:ora-25153 暂时表空间为空,这个错误,于是网上查了下.发现了例如以下解决方法:创建一个新的暂时表空间. 首先要有system权限.登录进 ...
- Java web轻量级开发面试教程的前言
本文来是从 java web轻量级开发面试教程从摘录的. 为什么要从诸多的Java书籍里选择这本?为什么在当前网络信息量如此大的情况下还要买这本书,而不是自己通过查阅网络资料学习?我已经会开发Java ...
- Elasticsearch和MongoDB分片及高可用对比
本文旨在对比Elasticsearch和MongoDB高可用和分片的实现机制. Elasticsearch ES天生就是分布式的,那她又是如何做到天生分布式的? 通过ES官方指南我们可以知道: 一个运 ...
- Django的信号机制
Django提供一种信号机制.其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) .当发生一些动作的时候,发出信号,然后监听了这个信号的callback函数就会执行. Djang ...
- Natas Wargame Level25 Writeup(头部注入+POST/GET注入)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAArsAAAC8CAYAAAB4+WYTAAAABHNCSVQICAgIfAhkiAAAIABJREFUeF
- .Net 异步方法, await async 使用
最近朋友问起await 和 async第一次听说这个await ,就查了一下这个await使用在于 异步方法async 中,中文意思就是等待,经过一系列的百度参考简单的明白了这个东西的意思, 异步 ...
- Visual Studio中将打开的代码与类文件进行关联
- Android Studio 快速开发
概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. P ...
- DotNetCore跨平台~Moq框架实现模拟测试
回到目录 当我们进行软件开发时,一般会写单元测试,而对于业务情景来说,一般是测试它的业务逻辑准确性,对于你的测试数据是否来自数据库还是文件,是否为真实还是模拟,并不是很关心!我关心的就是我的业务逻辑是 ...