定义:装饰器本质是函数,(装饰其他函数)就是为其他函数添加附加功能
原则: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的更多相关文章

  1. Python学习第四十天函数的装饰器用法

    在软件开发的过程中,要遵循软件的一些原则封装的,不改变原有的代码的基础增加一些需求,python提供了装饰器来扩展函数功能,下面说说函数装饰器用法 def debug(func):      def ...

  2. Python菜鸟之路:Python基础-逼格提升利器:装饰器Decorator

    一.装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等. 装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身 ...

  3. Python_高阶函数、装饰器(decorator)

    一.变量: Python支持多种数据类型,在计算机内部,可以把任何数据都看成一个“对象”,而变量就是在程序中用来指向这些数据对象的,对变量赋值就是把数据和变量给关联起来. 对变量赋值x = y是把变量 ...

  4. Python基础(闭包函数、装饰器、模块和包)

    闭包函数 格式: def 函数名1(): def 函数名2(): 变量 = 值 return 变量 return 函数名2 func = 函数名1() key = func()

  5. python 基础篇 11 函数进阶----装饰器

    11. 前⽅⾼能-装饰器初识本节主要内容:1. 函数名的运⽤, 第⼀类对象2. 闭包3. 装饰器初识 一:函数名的运用: 函数名是一个变量,但他是一个特殊变量,加上括号可以执行函数. ⼆. 闭包什么是 ...

  6. Python基础(7)闭包函数、装饰器

    一.闭包函数 闭包函数:1.函数内部定义函数,成为内部函数, 2.改内部函数包含对外部作用域,而不是对全局作用域名字的引用 那么该内部函数成为闭包函数 #最简单的无参闭包函数 def func1() ...

  7. python基础之闭包函数和装饰器

    补充:全局变量声明及局部变量引用 python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 global关键字用来在函数或其 ...

  8. python之集合,函数,装饰器

    本节主要内容如下: 1. set集合 2. 函数 -- 自定义函数 -- 内置函数 3. 装饰器 一. set 集合: 一个无序且不重复的序列. tuple算是list和str的杂合(杂交的都有自己的 ...

  9. python基础之闭包函数与装饰器

    闭包函数: 什么是闭包函数: 闭指的是定义在一个函数内部 包指的是该函数包含对外部作用域(非全局作用域)名字的引用 def counter(): n=0 def incr(): nonlocal n ...

随机推荐

  1. java-logic====吃货联盟

    1.系统界面 2.功能一 3.查看餐袋 4.签收订单 5.删除订单 6.我要点赞 主要分在两个类中: 第一个类entity,主要的是一些共有的属性 主要代码: public class entity ...

  2. SSM环境下配置log4j输出sql和异常到控制台和本地日志文件中

    1.引入日志依赖包 <!--解决Spring使用slf4j输出日志与log4j冲突的问题--> <dependency> <groupId>org.slf4j< ...

  3. jQuery中表单的常用操作(全选、反选)

    表单的全选.反选操作一 <form method="post" action=""> 你爱好的运动是?<input type="ch ...

  4. 巧用CSS属性visibility与opacity代替鼠标经过的jQuery事件

    一直使用jQuery的hover()函数来写鼠标经过事件,这几天发现其他同行直接使用CSS就搞定了.自己在线下也试了试: 当然也并不是没有前提条件,需要配合一些定位属性来使用(position/top ...

  5. SQLServer 连接和联合

    一.内连接(inner join) 默认省略inner ,内连接是严格过滤,等同where限制,连接两端的表都数据都需要过滤. 二.左外连接(left outer join) 以左表为基准进行数据连接 ...

  6. JavaScript 面向对象编程(二):继承

    Javascript面向对象编程(二):构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继 ...

  7. Ehcache的配置与使用

    Ehcache是JAVA内制的一个缓存框架! 目的:缓解频繁读取数据库的压力; 初步配置如下: <?xml version="1.0" encoding="UTF- ...

  8. 3dsmax2014的下载、安装与注册激活教程详解

    3dsmax2014的下载.安装与注册激活教程,虽然网上类似的教程文章不胜枚举,但大多比较粗枝大叶,没有详细的步骤,尤其对于电脑小白来说,更是不易参考,今天我就教大家如何注册破解3dsmax2014吧 ...

  9. python IDE-pycharm在virtualenv里安装软件

    1  windows命令行,进入venv下的scripts目录,执行activate.bat进入虚拟环境 2  以selenium安装为例,输入pip install selenium回车开始安装 3 ...

  10. RF脚本中的坑1: SyntaxError: invalid token

    话不多说,直接上调试脚本: 执行后${b}=8:没问题.然后${a}改成08继续: 执行后居然报错了: 经过多次尝试08或者09时,都会报SyntaxError错误:后来查阅语法,才恍然大悟:Pyth ...