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之装饰器的更多相关文章

  1. (转)Python3.5——装饰器及应用详解

    原文:https://blog.csdn.net/loveliuzz/article/details/77853346 Python3.5——装饰器及应用详解(下)----https://blog.c ...

  2. python3.7 装饰器

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 装饰器 #装饰器 ''' 定义:本质就是一个函数,作用是为其他函 ...

  3. python3练习-装饰器

    在廖雪峰的官方网站学习装饰器章节时,初步理解类似与面向切面编程.记录一下自己的课后习题解法. 问题: 请编写一个decorator,能在函数调用的前后打印出'begin call'和'end call ...

  4. Python3.5:装饰器的使用

    在Python里面函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数,简单来说函数也是变量也可以作文函数的参数 >>> def funA(): ... pr ...

  5. python3之装饰器修复技术@wraps

    普通函数 def f(): """ 这是一个用来测试装饰器修复技术的函数 """ print("哈哈哈") if __n ...

  6. Python3中装饰器的使用

    较为复杂的装饰器使用: user,passwd = 'hjc',111111 def auth(type): print('auth type:',type) def outwrapper(func) ...

  7. python3 使用装饰器,及函数作为参数

    #装饰import typesdef shucai(n): print('蔬菜价格7') if type(n)==types.FunctionType: return n()+7 return n+7 ...

  8. 【python3】装饰器

    参考文章: 理解Python装饰器(Decorator) 关键点: 写装饰器一定要搞定楚函数名后面带小括号和不带小括号的含义.带小括号,表示调用这个函数,而不带小括号,则表示的是该函数引用地址 简单装 ...

  9. python3中装饰器的用法总结

    装饰器预备知识点 1 函数赋值给一个变量 函数名可以像普通变量一样赋值给另一个变量. def test(): print("i am just a test function") ...

随机推荐

  1. String内存溢出异常(错误)可能的原因及解决方式

    摘要:本Blog主要为了阐述java.lang.OutOfMemoryError:PermGenspace可能产生的原因及解决方式. 当中PermGen space是Permanent Generat ...

  2. MySQL Study之--MySQL schema_information数据库

    MySQL Study之--MySQL schema_information数据库       information_schema数据库是在mysql的版本号5.0之后产生的,一个虚拟数据库,物理上 ...

  3. HDOJ 4251 The Famous ICPC Team Again

    划分树水题..... The Famous ICPC Team Again Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 3276 ...

  4. [基础规范]JavaBeans规范

    本文来自维基百科:http://en.wikipedia.org/wiki/JavaBeans#JavaBean_conventions JavaBeans是Java语言中能够反复使用的软件组件,它们 ...

  5. 《github一天一道算法题》:并归排序

    看书.思考.写代码! /******************************************* * copyright@hustyangju * blog: http://blog.c ...

  6. 使用Logstash来实时同步MySQL数据到ES

    上篇讲到了ES和Head插件的环境搭建和配置,也简单模拟了数据作测试 本篇我们来实战从MYSQL里直接同步数据 一.首先下载和你的ES对应的logstash版本,本篇我们使用的都是6.1.1 下载后使 ...

  7. mongodb 3.4 集群搭建:分片+副本集

    mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

  8. HTML5 Canvas:初始Canvas

    Canvas ,HTML 5中引入它,可以做很多事情:画图.动画.游戏开发等等. Canvas 元素 Canvas 中文翻译为:画布. <canvas id=”yourCanvasId” wid ...

  9. AI 系列 总目录

    AI 系列 答应了园区大牛 张善友 要写AI 的系列博客,所以开始了AI 系列之旅. 一.四大平台系列(百度AI.阿里ET.腾讯.讯飞) 1.百度篇 (1) 百度OCR文字识别-身份证识别 (2) 基 ...

  10. iOS 5个Xcode开发调试技巧

    转自Joywii的博客,原文:Four Tips for Debugging in XCode Like a Bro    1.Enable NSZombie Objects(开启僵尸对象) Enab ...