阅读目录

一、装饰器

1、装饰器的概念

#装饰器定义:本质就是函数,功能是为其他函数添加附加功能

二、装饰器需要遵循的原则

#原则:
1、不修改被修饰函数的源代码
2、不修改被修饰函数的调用方式 装饰器他人的器具,本事可以是任意可调用对象,被装饰者也可以是任意可调用对象。 #强调装饰器的原则:
1、不修改被装饰对象的源代码
2、不修改被装饰对象的调用方式 #装饰器的目标:
在遵循1和2原则的前提下,为被装饰的对象添加新功能

三、实现装饰器知识储备

装饰器=高阶函数+函数嵌套+闭包

四、高阶函数

高阶函数的定义:
1、函数接收的参数是一个函数名
2、函数的返回值是一个函数名
3、满足上述条件任意一个,都可称之为高阶函数

五、函数嵌套

def father(name):
print('from father %s' %name)
def son():
print('from the son')
def grandson():
print('from the grandson')
grandson()
son() father('朱锐')

六、闭包

1、闭包

def father(name):
print('from father %s' %name)
def son():
print('from the son')
def grandson():
print('from the grandson')
grandson()
son() father('朱锐') '''
闭包
''' def father(name):
def son():
# name='simon1'
print('我的爸爸是%s' %name)
def grandson():
print('我的爷爷是%s' %name)
grandson()
son()
father('simon')

2、函数闭包装饰器基本实现

import time
def timmer(func):
def wrapper():
# print(func)
start_time=time.time()
func() #就是在运行test()
stop_time=time.time()
print('运行时间是%s' %(stop_time-start_time))
return wrapper
@timmer #语法糖,这个是重点 def test():
time.sleep(3)
print('test函数运行完毕') # res=timmer(test) #返回的是wrapper的地址
# res() #执行的是wrapper() # test=timmer(test) #返回的是wrapper的地址
# test() #执行的是wrapper() test()
'''
语法糖
'''
# @timmer #就相当于 test=timmer(test)

3、函数闭包加上返回值

#未加返回值
import time
def timmer(func):
def wrapper():
# print(func)
start_time=time.time()
func() #就是在运行test()
stop_time=time.time()
print('运行时间是%s' %(stop_time-start_time))
return 123
return wrapper
@timmer #语法糖 def test():
time.sleep(3)
print('test函数运行完毕')
return '这是test的返回值'
res=test() #就是在运行wrapper
print(res) 运行结果如下:
C:\Python35\python3.exe G:/python_s3/day20/加上返回值.py
test函数运行完毕
运行时间是3.000171661376953
123
#加上返回值
import time
def timmer(func):
def wrapper():
# print(func)
start_time=time.time()
res=func() #就是在运行test() ##主要修改这里1
stop_time=time.time()
print('运行时间是%s' %(stop_time-start_time))
return res ##修改这里2
return wrapper
@timmer #语法糖 def test():
time.sleep(3)
print('test函数运行完毕')
return '这是test的返回值'
res=test() #就是在运行wrapper
print(res) 运行结果如下:
C:\Python35\python3.exe G:/python_s3/day20/加上返回值.py
test函数运行完毕
运行时间是3.000171661376953
这是test的返回值

4、函数闭包加上参数

import time
def timmer(func):
def wrapper(name,age): #加入参数,name,age
# print(func)
start_time=time.time()
res=func(name,age) ##加入参数,name,age
stop_time=time.time()
print('运行时间是%s' %(stop_time-start_time))
return res
return wrapper
@timmer #语法糖 def test(name,age): #加入参数,name,age
time.sleep(3)
print('test函数运行完毕,名字是【%s】,年龄是【%s】' % (name,age))
return '这是test的返回值'
res=test('simon',18) #就是在运行wrapper
print(res)

使用可变长参数代码如下:达到的效果是传参灵活

import time
def timmer(func):
def wrapper(*args,**kwargs): #test('simon',18) args=('simon') kwargs={'age':18}
# print(func)
start_time=time.time()
res=func(*args,**kwargs) #就是在运行test() func(*('simon'),**{'age':18})
stop_time=time.time()
print('运行时间是%s' %(stop_time-start_time))
return res
return wrapper
@timmer #语法糖 def test(name,age):
time.sleep(3)
print('test函数运行完毕,名字是【%s】,年龄是【%s】' % (name,age))
return '这是test的返回值'
def test1(name,age,gender):
time.sleep(1)
print('test函数运行完毕,名字是【%s】,年龄是【%s】,性别是【%s】' % (name,age,gender))
res=test('simon',18) #就是在运行wrapper
print(res) test1('simon',18,'male')

5、装饰器的使用

#无参装饰器
import time
def timmer(func):
def wrapper(*args,**kwargs):
start_time=time.time()
res=func(*args,**kwargs)
stop_time=time.time()
print('run time is %s' %(stop_time-start_time))
return res
return wrapper @timmer
def foo():
time.sleep(3)
print('from foo')
foo()
#有参装饰器
def auth(driver='file'):
def auth2(func):
def wrapper(*args,**kwargs):
name=input("user: ")
pwd=input("pwd: ") if driver == 'file':
if name == 'simon' and pwd == '':
print('login successful')
res=func(*args,**kwargs)
return res
elif driver == 'ldap':
print('ldap')
return wrapper
return auth2 @auth(driver='file')
def foo(name):
print(name) foo('simon')

#验证功能装饰器

#验证功能装饰器
user_list=[
{'name':'simon','passwd':''},
{'name':'zhurui','passwd':''},
{'name':'william','passwd':''},
{'name':'zhurui1','passwd':''},
]
current_dic={'username':None,'login':False} def auth_func(func):
def wrapper(*args,**kwargs):
if current_dic['username'] and current_dic['login']:
res=func(*args,**kwargs)
return res
username=input('用户名:').strip()
passwd=input('密码:').strip()
for user_dic in user_list:
if username == user_dic['name'] and passwd == user_dic['passwd']:
current_dic['username']=username
current_dic['login']=True
res=func(*args,**kwargs)
return res
else:
print('用户名或者密码错误') # if username == 'simon' and passwd == '123':
# user_dic['username']=username
# user_dic['login']=True
# res=func(*args,**kwargs)
# return res
# else:
# print('用户名或密码错误')
return wrapper @auth_func
def index():
print('欢迎来到某宝首页')
@auth_func
def home(name):
print('欢迎回家%s' %name)
@auth_func
def shopping_car(name):
print('%s购物车里有[%s,%s,%s]' %(name,'餐具','沙发','电动车')) print('before----->',current_dic)
index()
print('after---->',current_dic)
home('simon')
# shopping_car('simon')

#带参数验证功能装饰器

#带参数验证功能装饰器
user_list=[
{'name':'simon','passwd':''},
{'name':'zhurui','passwd':''},
{'name':'william','passwd':''},
{'name':'zhurui1','passwd':''},
]
current_dic={'username':None,'login':False} def auth(auth_type='filedb'):
def auth_func(func):
def wrapper(*args,**kwargs):
print('认证类型是',auth_type)
if auth_type == 'filedb':
if current_dic['username'] and current_dic['login']:
res = func(*args, **kwargs)
return res
username=input('用户名:').strip()
passwd=input('密码:').strip()
for user_dic in user_list:
if username == user_dic['name'] and passwd == user_dic['passwd']:
current_dic['username']=username
current_dic['login']=True
res = func(*args, **kwargs)
return res
else:
print('用户名或者密码错误')
elif auth_type == 'ldap':
print('这玩意没搞过,不知道怎么玩')
res = func(*args, **kwargs)
return res
else:
print('鬼才知道你用的什么认证方式')
res = func(*args, **kwargs)
return res return wrapper
return auth_func @auth(auth_type='filedb') #auth_func=auth(auth_type='filedb')-->@auth_func 附加了一个auth_type --->index=auth_func(index)
def index():
print('欢迎来到某宝主页') @auth(auth_type='ldap')
def home(name):
print('欢迎回家%s' %name)
#
@auth(auth_type='sssssss')
def shopping_car(name):
print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃')) # print('before-->',current_dic)
# index()
# print('after--->',current_dic)
# home('simon')
shopping_car('simon')

Python之路【第七篇】:Python装饰器的更多相关文章

  1. python之路第五篇之装饰器:(进阶篇)

    装饰器: 学前必备知识: def f1(): print "f1" f1() #表示函数执行 f1 #表示函数,指向内存地址 f1 = lambda x: x + 1 f1() # ...

  2. Python之路(第七篇)Python作用域、匿名函数、函数式编程、map函数、filter函数、reduce函数

    一.作用域 return 可以返回任意值例子 def test1(): print("test1") def test(): print("test") ret ...

  3. 【Python之路】特别篇--Python装饰器

    前情提要 1. 作用域 在python中,函数会创建一个新的作用域.python开发者可能会说函数有自己的命名空间,差不多一个意思.这意味着在函数内部碰到一个变量的时候函数会优先在自己的命名空间里面去 ...

  4. 流畅的python学习笔记第七章:装饰器

    装饰器就如名字一样,对某样事物进行装饰过后然后返回一个新的事物.就好比一个毛坯房,经过装修后,变成了精装房,但是房子还是同样的房子,但是模样变了. 我们首先来看一个函数.加入我要求出函数的运行时间.一 ...

  5. NO.4:自学python之路------内置方法、装饰器、迭代器

    引言 是时候开始新的Python学习了,最近要考英语,可能不会周更,但是尽量吧. 正文 内置方法 Python提供给了使用者很多内置方法,可以便于编程使用.这里就来挑选其中大部分的内置方法进行解释其用 ...

  6. python之路 内置函数,装饰器

    一.内置函数 #绝对值 abs() #所有值都为真才为真 all() #只要有一个值为真就为真 any() #10进制转成二进制 bin() #10进制转成八进制 oct() #10进制转成十六进制 ...

  7. python之路_函数实例及装饰器介绍

    一.习题讲解 1.写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组.例如:[(‘红心’,2), (‘草花’,2), …(‘黑桃,‘A’)] def cards(): num=[] for v ...

  8. 【Python之路】第九篇--Python基础之线程、进程和协程

    进程与线程之间的关系 线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除.线程可与属于同一进程的其它线程共享进程所拥有的全 ...

  9. Python之路(第五篇) Python基本数据类型集合、格式化、函数

    一.变量总结 1.1 变量定义 记录某种状态或者数值,并用某个名称代表这个数值或状态. 1.2 变量在内存中的表现形式 Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是 ...

  10. 【Python之路】特别篇--Python面向对象(进阶篇)

    上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

随机推荐

  1. 不使用JavaScript实现菜单的打开和关闭

    我在写有菜单栏的网页时,基本都会用响应式设计来适配移动端,例如把不重要的菜单选项隐藏,或者创建一个菜单按钮来控制的菜单的打开和关闭之类的.而我之前一直是使用JavaScript来实现菜单的打开和关闭的 ...

  2. PHP 的 uniqid 函数产生的 id 真的是唯一的么?

    PHP 的 uniqid 函数产生的 id 真的是唯一的么? 最近使用到了 uniqid,就产生了疑问?uniqid 生成的 id 由什么组成?真的是唯一的么?什么情况下会产生冲突? 从文档中看到 u ...

  3. Tar专题

    下面的脚本根据当前的系统时间生成压缩文件名,并备份文件到指定目录: DIR=/www/webbackup/web/ FILE_NAME=`date +%y%m%d%H` FILE_NAME=$DIR/ ...

  4. Mybatis通过注解方式实现批量插入数据库 及 常见的坑

    原文地址:http://f0rb.iteye.com/blog/1207384 MyBatis中通过xml文件配置数据库批量操作的文章很多,比如这篇http://www.cnblogs.com/xcc ...

  5. pymysql 详解

    上一章 pymysql安装完之后 进入到pymysql路径下,可以看到下面文件列表 首先 这是我的pymysql文件路径 进入pymysql的文件夹 可以看到下面这些文件列表 pymysql 数据类型 ...

  6. Cookie防篡改机制

    一.为什么Cookie需要防篡改 为什么要做Cookie防篡改,一个重要原因是 Cookie中存储有判断当前登陆用户会话信息(Session)的会话票据-SessionID和一些用户信息. 当发起一个 ...

  7. 小米笔记本怎么关闭secure boot

    关闭Secure Boot的步骤: 一.关闭 "快速启动" 功能 1.右键-开始菜单- 电源选项,进入后 点击"选择电源按钮的功能". 2.进入电源选项设置后, ...

  8. 接口测试返回的json文件中字符串是乱序

    问题描述 接口测试中post方式匹配返回信息时显示不匹配, 但是statuscode明明是200, 而且用postman /restclient等工具测出来也是没问题的. 根本原因 封装了这么个方法来 ...

  9. OFFICE2007软件打开word时出现SETUP ERROR的解决方法

    今天打开word时出现以下错误窗口: 在度娘上找了一下解决方案,原来每次打开word时都会启动一些无用的东西,找到这些东西的路径D:\Program Files\Common Files\micros ...

  10. LOJ_6045_「雅礼集训 2017 Day8」价 _最小割

    LOJ_6045_「雅礼集训 2017 Day8」价 _最小割 描述: 有$n$种减肥药,$n$种药材,每种减肥药有一些对应的药材和一个收益. 假设选择吃下$K$种减肥药,那么需要这$K$种减肥药包含 ...