定义:装饰器本质是函数,(装饰其他函数)就是为其他函数添加附加功能
原则: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. hibernate课程 初探一对多映射2-5 创建持久化类并配置映射文件

    学习点: 1 一对多映射,一方 Grade.hbm.xml的写法: <hibernate-mapping> <class name="com.ddwei.entity.Gr ...

  2. vue-router配置

    首先在App.vue中 1.使用router-link组件来导航,通过‘to'属性指定链接,<router-link> 默认会被渲染成一个 `<a>` 标签 <route ...

  3. Linux命令之查看日志等实时文件命令(less 、tail)使用

    一.less的使用 1)less  文件名,即可快速打开文件 2)相关查看搜索 3)利用键盘向上向下箭头键盘上的向上和向下箭头,点击一次向下简单,文件内容往下读取一行:点击一次向上箭头,文件内容,往上 ...

  4. Scikit Learn

    Scikit Learn Scikit-Learn简称sklearn,基于 Python 语言的,简单高效的数据挖掘和数据分析工具,建立在 NumPy,SciPy 和 matplotlib 上.

  5. 笨办法学Python(三十六)

    习题 36: 设计和调试 现在你已经学会了“if 语句”,我将给你一些使用“for 循环”和“while 循环”的规则,一面你日后碰到麻烦.我还会教你一些调试的小技巧,以便你能发现自己程序的问题.最后 ...

  6. 笨办法学Python(三)

    习题 3: 数字和数学计算 每一种编程语言都包含处理数字和进行数学计算的方法.不必担心,程序员经常撒谎说他们是多么牛的数学天才,其实他们根本不是.如果他们真是数学天才,他们早就去从事数学相关的行业了, ...

  7. JSON:json_encode函数不能获取属性原因及解决方案

    json_encode()是个解析json数据的函数,但是这个函数可以有两个参数 形式: json_decode ( string  $json,  ture || false )   第一个参数传字 ...

  8. 正则表达式转换python2的print为python3风格

    直接查找 print ([^\n\(]*)替换为 print($1)

  9. WIN7如何在任务栏建立我的电脑的快捷图标

    1. 在桌面空白处鼠标右击->新建->快捷方式,在弹出的对话框中输入  %SystemRoot%\explorer.exe /E,::{20D04FE0-3AEA-1069-A2D8-08 ...

  10. Cydia Tweak--Cydia Substrate

    http://www.jianshu.com/p/8982e9670fc6 Cydia Substrate.MobileHooker MSHookMessageEx MSHookFunction Mo ...