python学习之-- 装饰器
高阶函数+嵌套函数 == 装饰器
什么是装饰器: 其实也是一个函数。
功能:为其他的函数添加附加功能
原则:不能修改被装饰的函数的源代码和调用方式 学习装饰器前首先要明白以下3条事项:
1:函数 即 “变量” (什么意思呢,就是说我们定义的一个函数,其中函数名就是一个变量,函数体就是存于内存的数据)。
def foo(): #函数名就相当于变量
print('test') #函数体就相当于内容
类似于:x(变量) = 1(内容)
内容实际存储于内存,变量相当于门牌号(映射内存内容)。
实例
def foo():
print('in the foo')
bar()
def bar():
print('in the bar')
foo()
2:高阶函数
条件1:把一个函数名当作实参传给另一个函数(在不修改被装饰函数源码的情况下为其添加附加功能)
举例:当调用执行函数fun1时候,会把bar函数当作实参传入,在fun1函数内对形参进行执行fun() -> bar ->bar()
def bar():
print('in the bar')
def fun1(fun):
print('start) #进行装饰
fun() #执行的核心函数
print('end') #进行装饰
fun1(bar)
条件2:函数的返回值中包含n>0个函数。(不修改函数的调用方式)
举例:
def bar():
time.sleep(3)
print('in the bar')
def test2(func):
print(func)
return func
bar = test2(bar)
bar() #这里就是源函数被修饰后,再次调用返回被修饰后的结果
3:嵌套函数:一个函数体内创建另一个函数,最外层函数相当于全局变量,函数内部的所有函数都相当于局部变量,只在局部作用域有效。
举例:
def foo():#这里相当于全局变量
print('in the foo')
def bar(): # 这里相当于局部变量,只在局部作用域有效。
print('in the bar')
bar() #执行局部变量
foo() #执行函数调用
装饰器实例1:先加载timer函数体到内存,然后在@timer相当于将test1函数作为实参传递给timer函数,最后调用test1()函数,就相当于执行timer函数内的warpper函数,将内部执行结果返回 给test1
def timer(func): # func = test1
def warpper():
start_time = time.time()
func()
end_time = time.time()
print('the function time is %s' %(stop_time-start_time)
return warpper()
@timer #test1=timer(test1)
def test1():
time.sleep(3)
print('in the test')
test1() #这里test1就相当于在执行warpper函数
装饰器实例2带参数
import time
def timer(fun): # 传入每个被装饰的函数名
def bar(*args,**kwargs): # 传入每个被装饰的函数参数
start = time.time()
fun(*args,**kwargs)
end = time.time()
print('time:%s' % (end-start))
return bar
@timer
def test1():
time.sleep(1)
print('in the test1')
@timer
def test2(name,age):
print('test2:',name,age)
test1()
test2('jeck',age=22)
装饰器-补充:如何返回被装饰的函数的return值
user,passwd = 'jeck','abc123'
def auth(func):
def warpper(*args,**kwargs):
username = input('username')
password = input('password')
if username == user and password == passwd:
print('user has passwd authentication')
mess = func(*args,**kwargs) # 这里返回func函数的return值
return mess # 这里将mess的值返回给warpper
else:
exit('error password')
return warpper # 返回warpper值,包含mess的 def index():
print('welcome to index page')
@auth
def home():
print('welcome to home page')
return 'from home' #这里的return如何通过装饰器返回
@auth
def bbs():
print('welcome to bbs page')
index()
print(home()) #这里要用print打印使用return返回的值
bbs()
装饰器--高级版,这里让上面例子里home用普通验证,bbs用ldap验证
import time
name,pwd = 'jeck',''
def auth_type(auth_type):#认证模式参数传入
def auth(fun):
def warpper(*args,**kwargs):
if auth_type == 'local': # 根据认证模式执行函数
name = input('name:')
passwd = input('passwd:')
if name == name and passwd == pwd:
print('welcome logname :%s' % name)
content = fun(*args,**kwargs)
return content
elif auth_type == 'ldap': #根据认证模式执行函数
print('ldap')
content = fun(*args,**kwargs)
return content
return warpper
return auth
def index():
print('welcome to index page')
@auth_type(auth_type = 'local')# 增加认证模式的选择
def home():
print('welcome to home page')
return 'from home' #需要获取这里的return返回
@auth_type(auth_type = 'ldap') # 增加认证模式的选择
def bbs(name,age):
print('welcome to bbs page')
return name,age
index()
print(home())
print(bbs('bard',age=22))
python学习之-- 装饰器的更多相关文章
- python学习笔记--装饰器
1.首先是一个很无聊的函数,实现了两个数的加法运算: def f(x,y): print x+y f(2,3) 输出结果也ok 5 2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来 ...
- python 学习分享-装饰器篇
本篇内容为偷窃的~哈哈,借用一下,我就是放在自己这里好看. 引用地址:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: ...
- python学习之装饰器-
python的装饰器 2018-02-26 在了解python的装饰器之前我们得了解python的高阶函数 python的高阶函数我们能返回一个函数名并且能将函数名作为参数传递 def outer() ...
- python学习day14 装饰器(二)&模块
装饰器(二)&模块 #普通装饰器基本格式 def wrapper(func): def inner(): pass return func() return inner def func(): ...
- Python学习 :装饰器
装饰器(函数) 装饰器作为一个函数,可以为其他函数在不修改原函数代码的前提下添加新的功能 装饰器的返回值是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等 ...
- Python学习笔记--装饰器的实验
装饰器既然可以增加原来函数的功能,那能不能改变传给原函数的参数呢? 我们实验一下,先上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date ...
- 6月4日 python学习总结 装饰器复习
1. 装饰器的原理以及为什么要使用装饰器 在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator). 在不影响原代码结构的情况下为其添加功能 2. 装饰器的基本 ...
- python学习 day13 装饰器(一)&推导式
装饰器&推导式 传参位置参数在前,关键词参数在后 函数不被调用内部代码不被执行 函数在被调用的时候,每次都会开辟一个新的内存地址,互不干扰 #经典案例 def func(num): def i ...
- Python学习之装饰器进阶
函数知识回顾: 函数的参数分为:实参和形参. 实参:调用函数的时候传入的参数: 形参:分为3种(位置参数.默认参数.动态传参) 位置参数:必须传值 def aaa(a,b): print(a,b) a ...
随机推荐
- IDEA下MyBatis错误总结
1. Pom.xml配置 语法顺序 <properties resource="config.properties"> </properties> < ...
- android AutoCompleteTextView 实现手机号格式化,附带清空历史的操作
有个小伙伴遇到了这样一个问题,就是AutoCompleteTextView实现自动填充的功能.同时要具备手机格式化的功能.下拉列表最后一行是有个清除历史的功能.可是点击“清除历史”却把文字要设置进去A ...
- 推荐一款功能强大的Tomcat 管理监控工具,可替代Tomcat Manager
我们在本地启动Tomcat服务器后,用localhost:访问: 再点Manager App,即可进入Tomcat自带的Manager这个应用,此处可以单独部署/卸载每一个应用.可以看到在Manage ...
- CortexA7工业级迅为-iMX6UL开发板硬件和资料介绍
商业级核心板 ARM Cortex-A7架构 主频高达528 MHz 核心板512M DDR内存 8G EMMC 存储 运行温度:-20℃ ~ +80℃ CPU集成电源管理 核心板尺寸仅:42mm*3 ...
- Oracle数据库升级前必要的准备工作
Oracle数据库升级向来是一门纷繁复杂的工程,DBA需要为产品数据库的升级耗费大量时间精力在准备工作上:因为其升级复杂度高,所以即便做了较为充分的准备仍可能在升级过程中遇到意想不到的问题,为了更高效 ...
- (转)使用JDK中的Proxy技术实现AOP功能
http://blog.csdn.net/yerenyuan_pku/article/details/52863780 AOP技术在企业开发中或多或少都会用到,但用的最多的大概就是做权限系统时,在做权 ...
- du - 报告磁盘空间使用情况
总览 du [options] [file...] POSIX 选项: [-askx] GNU 选项 (最短格式): [-abcDhHklLmsSxX] [--block-size=size] [-- ...
- nginx发布web网站
修改/conf/nginx.conf配置文件 server { listen *:; # Listen server_name ""; # Don't worry if " ...
- 秋招复习-C++(三)
• 数据库 1.数据库的索引有哪些? (1)B树索引:利用B树作为底层数据结构的索引,在B树索引中保存索引列的值和数据表的对应行的ID,每一个叶子结点都存放着一个索引列的值和数据表对应行的ID,通过这 ...
- c++内联函数解析(inline)
一.基本定义 inline是C++语言中的一个关键字,可以用于程序中定义内联函数,inline的引进使内联函数的定义更加简单.说到内联函数,这里给出比较常见的定义,内联函数是C++中的一种特殊函数,它 ...