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. 关于子线程更新UI

    大家都了解的子线程不能更新UI,所以普通青年比方我,遇到耗时操作用到线程时.不得不立刻想到了用handler传递来解决UI更细的问题. 普通青年的做法: 方案:使用Thread+handler方式,h ...

  2. Property list types and their various representations

    iOS下Property list能够存储的数据类型  Property list types and their various representations  Abstract type XML ...

  3. 使用Mybatis-Generator自己主动生成Dao、Model、Mapping相关文件

    准备工作: 1.数据库驱动程序 2.generatorConfig驱动,(下载地址:https://github.com/mybatis/generator/releases) 3.generator ...

  4. Creational模式之Builder模式

    1.意图 将一个复杂对象的构建与它表示分离,使得相同的构建过程能够创建不同的表示. 查看很多其它请点击 2.别名 无 3.动机 一个RTF(Rich Text Format)文档交换格式的阅读器应能将 ...

  5. 知名互联网公司校招 Java 开发岗面试知识点解析

    天之道,损有余而补不足,是故虚胜实,不足胜有余. 本文作者在一年之内参加过多场面试,应聘岗位均为 Java 开发方向.在不断的面试中,分类总结了 Java 开发岗位面试中的一些知识点. 主要包括以下几 ...

  6. shell脚本小案例

    1.获取远程ftp数据到本地目录 #!/bin/bash ftp -n<<! open 135.0.24.19 user exchange exchange binary cd /idep ...

  7. springboot+多数据源配置

    作者:纯洁的微笑 出处:http://www.ityouknow.com/ 起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持业务.我们项目是后者的模式,网上找了很多 ...

  8. mybatis中#和$符号的区别(转)

    mybatis做为一个轻量级ORM框架在许多项目中使用,因其简单的入门受到了广大开发者的热爱.在近期项目中再做一个相关的开发,碰到了#.$符号这样的问题,之前没怎么注意过,通过学习之后,有了点感悟,分 ...

  9. Mac环境下实现alias重命名命令(永久生效)

    Mac环境下实现alias重命名命令 iOS Dev在使用Xcode完成代码编写后,可能需要上传至第三方分发应用给测试人员进行相关测试,比如蒲公英.FIR. 效率较高的上传方式是借助于Fastlane ...

  10. 《Head First 设计模式》【PDF】下载

    <Head First 设计模式>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196307 First 设计模式>[PDF] ...