学习python第十三天,函数5 装饰器decorator
定义:装饰器本质是函数,(装饰其他函数)就是为其他函数添加附加功能
原则:1、不能修改被装饰的函数的源代码
2、不能修改装饰的函数的调用方式 实现装饰器知识储备
1函数即变量
2、高阶函数,满足2个条件之一 1、把一个函数名当做实参传给另外一个函数。2、返回值中包含函数名
(1、在不修改被装饰的函数的源代码的情况下,为其添加功能 2、不能修改函数的调用方式)
3、嵌套函数
高阶函数+嵌套函数=》装饰器
python内存回收机制,匿名函授和变量名没有的情况下会被回收
def foo():
print('in the foo')
bar()
def bar():
print('in the bar')
foo()
import time def bar():
time.sleep(0.5)
print('in the bar') def test1(func):
start_time=time.time()
print(func)
time.sleep(0.5)
func()
stop_time=time.time()
print("the func run time is %s"%(stop_time-start_time)) test1(bar)#打印内存地址,调用方式改变了 import time def bar():#定义原始函数
time.sleep(0.5)#停止0.5秒
print('in the bar')#定义过程
def test2(func):#定义装饰器函数
print(func)#定义过程
return func#返回值“func”
print(test2(bar))#打印函数test2在bar中的内存地址
bar=test2(bar)#重新定义变量bar=函数test2以bar为实参
bar()#run bar#运行bar
嵌套函数:在一个函数的体内用def去声明一个函数
def foo():
print('in the foo')
def bar():#在一个函数的体内用def去声明一个函数
print('in the bar') bar()
foo()
x=0
def gramdpa():
x=1
def dad():
x=2
def son():
x=3
print(x)
son()
dad()
gramdpa() import time
装饰器1——>无参数装饰器(包含高阶\嵌套函数) 要实现的功能是查看“源代码”程序运行了多少时间
def timer(func):#定义一个名为timer的函数,参数为func,timer(test1)把test1的内存地址传给了func
def deco():#声明一个新的函数deco,函数的嵌套,他的作用
start_time=time.time()#开始时间
func()#等于运行run test1 适用无参数的源代码
stop_time=time.time()#结束时间
print('the func run time is %s'%(stop_time-start_time))#打印...
return deco#高阶函数返回值中有函数deco内存地址 @timer
#源代码
def test1(): #定义名为test1函数
time.sleep(1)#等3秒
print('in the test1')#函数过程 打印...
print(timer(test1))
test1=timer(test1)
test1()#--->执行deco
装饰器2-->含多个参数(包含高阶\嵌套函数) 要实现的功能是查看“源代码”程序运行了多少时间
import time
def timer(func):#定义一个名为timer的函数,参数为func,timer(test1)把test1的内存地址传给了func
def deco(*args,**kwargs):#声明一个新的函数deco,函数的嵌套,他的作用
start_time=time.time()#开始时间
func(*args,**kwargs)#等于run test1 *args,**kwargs适用任何参数的源代码
stop_time=time.time()#结束时间
print('the func run time is %s'%(stop_time-start_time))#打印...
return deco#高阶函数返回值中有函数deco内存地址 @timer
源代码
def test1(): #定义名为test1函数
time.sleep(1)#等3秒
print('in the test1')#函数过程 打印...
print(timer(test1))
test1=timer(test1)
test1()#--->执行deco @timer
def test2(name,age):#定义名为test2函数,含有name参数
print("test2:",name,age)#打印 ... test1()
test2("dream",22)#对应源代码加入参数才能运行
装饰器3--输入用户名密码,(源代码没有返回数据的装饰器)
import time
user,passwd='dream','133456'#默认密码
def auth(func):
def wrapper(*args,**kwargs):
print("wrapper func args:",*args,**kwargs)
username=input("Username:").strip()#移除空格和回车字符
password=input("Password:").strip()
if user==username and passwd==password:#验证用户名和密码
print('\033[32;1mUser has passed authentication\033[0m')
func(*args,**kwargs)#执行源代码
else:
exit('\33[31;1mInvalid username or password\033[0m')#否则退出
return wrapper @auth
def index():
print('welcome to index page')
@auth
def home():
print("welcome to home page") @auth
def bbs():
print("welcome to home page") # index()
# home()
# bbs()
#装饰器4--输入用户名密码,源代码含有返回数据的装饰器
import time
user,passwd='dream','133456'#默认密码
def auth(func):
def wrapper(*args,**kwargs):
# print("wrapper func args:",*args,**kwargs)
username=input("Username:").strip()#移除空格和回车字符
password=input("Password:").strip()
if user==username and passwd==password:#验证用户名和密码
print('\033[32;1mUser has passed authentication\033[0m')
res=func(*args,**kwargs)#定义一个变量
return res else:
exit('\33[31;1mInvalid username or password\033[0m')#否则退出
return wrapper @auth
def index():
print('welcome to index page')
@auth
def home():
print("welcome to home page")
return "from home" @auth
def bbs():
print("welcome to home page") # #index()
# print(home())
# #bbs()
装饰器5--输入用户名密码,判断本地认证和远程认证
import time
user,passwd='dream','133456'#默认密码
def auth(auth_type):
print("auth func:",auth_type)
def outer_wrapper(func):
def wrapper(*args,**kwargs):#定义wrapper函数带有两个函数
print("wrapper func args:",*args,**kwargs)
if auth_type=='local':
username=input("Username:").strip()#移除空格和回车字符
password=input("Password:").strip()
if user==username and passwd==password:#验证用户名和密码
print('\033[32;1mUser has passed authentication\033[0m')
res=func(*args,**kwargs)#执行源代码
print('---after authenticaion')
return res
else:
exit('\33[31;1mInvalid username or password\033[0m')#否则退出 elif auth_type=="ldap":
print("行不通")
return wrapper return outer_wrapper def index():
print('welcome to index page')
@auth(auth_type="local")#本地认证
def home():
print("welcome to home page")
return "from home"
@auth(auth_type="ldap") #远程认证
def bbs():
print("welcome to home page")
#
#index()
home()
bbs()
学习python第十三天,函数5 装饰器decorator的更多相关文章
- Python学习第四十天函数的装饰器用法
在软件开发的过程中,要遵循软件的一些原则封装的,不改变原有的代码的基础增加一些需求,python提供了装饰器来扩展函数功能,下面说说函数装饰器用法 def debug(func): def ...
- Python菜鸟之路:Python基础-逼格提升利器:装饰器Decorator
一.装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等. 装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身 ...
- Python_高阶函数、装饰器(decorator)
一.变量: Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来. 对变量赋值x = y是把变量 ...
- Python基础(闭包函数、装饰器、模块和包)
闭包函数 格式: def 函数名1(): def 函数名2(): 变量 = 值 return 变量 return 函数名2 func = 函数名1() key = func()
- python 基础篇 11 函数进阶----装饰器
11. 前⽅⾼能-装饰器初识本节主要内容:1. 函数名的运⽤, 第⼀类对象2. 闭包3. 装饰器初识 一:函数名的运用: 函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数. ⼆. 闭包什么是 ...
- Python基础(7)闭包函数、装饰器
一.闭包函数 闭包函数:1.函数内部定义函数,成为内部函数, 2.改内部函数包含对外部作用域,而不是对全局作用域名字的引用 那么该内部函数成为闭包函数 #最简单的无参闭包函数 def func1() ...
- python基础之闭包函数和装饰器
补充:全局变量声明及局部变量引用 python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 global关键字用来在函数或其 ...
- python之集合,函数,装饰器
本节主要内容如下: 1. set集合 2. 函数 -- 自定义函数 -- 内置函数 3. 装饰器 一. set 集合: 一个无序且不重复的序列. tuple算是list和str的杂合(杂交的都有自己的 ...
- python基础之闭包函数与装饰器
闭包函数: 什么是闭包函数: 闭指的是定义在一个函数内部 包指的是该函数包含对外部作用域(非全局作用域)名字的引用 def counter(): n=0 def incr(): nonlocal n ...
随机推荐
- Spring Boot + Redis 实现Shiro集群
为实现Web应用的分布式集群部署,要解决登录session的统一.本文利用shiro做权限控制,redis做session存储,结合spring boot快速配置实现session共享. 1.引入相关 ...
- 处理移动端自适应布局的方法- calc()与vw
在处理移动端自适应布局时,目前前端最流行的方法应该就是使用媒体查询,来设置HTML的字体大小,然后用rem为单位对Dom的宽高进行设置,这个方法的优势在于兼容性方面很好,劣势则在于当前市场上不同的机型 ...
- sharepoint2007就地升级2010系列(五)升级到sharepoint2010
---恢复内容结束--- 大家下午好 今天我们来完成最后一步,sharepoint2007升级2010.其实我反倒没有那么紧张了,因为我最担心的数据库升级,已经过了. OK,话不多说,让我们直接开始吧 ...
- Android Vmp加固实现流程图
0x00: 目前各种加固都说是VMP了,简单分析市面上的加固,然后自己实现了一个类似原理的加固,大致流程图如下: 加固端: 解释器:
- 腾讯bugly 映射用法
package com.tencent.bugly.agent; import android.app.Activity; import android.content.Context; import ...
- Azure本月最新活动,速度Mark!
桃花夭夭,渌水盈盈,就这样四月的脚步迫不及待地来了.为了帮助您能在第一时间了解 Azure 最新的活动,我们推出每月活动合集,你准备好了吗,一起来看吧! 立即访问http://market.azure ...
- html+javascript+soap获取webservice免费天气预报信息
转自:http://blog.163.com/hubeimeiyu@126/blog/static/8004881020118303318687/ 首先,也是最重要的是互联网上免费的天气预报源:htt ...
- ztree的数据绑定
ztree用法(1)首先引用ztree的css和js <link type="text/css" rel="stylesheet" href=" ...
- 笨办法学Python(五)
习题 5: 更多的变量和打印 我们现在要键入更多的变量并且把它们打印出来.这次我们将使用一个叫“格式化字符串(format string)”的东西. 每一次你使用 " 把一些文本引用起来,你 ...
- reactjs--父组件调用子组件的内部方法(转载)
reactjs--父组件调用子组件的内部方法 发表于2016/10/11 9:21:37 965人阅读 1.引入相关js <script src="js/react.js" ...