第九篇 装饰器

阅读目录

一 什么是装饰器

二 装饰器需要遵循的原则

三 实现装饰器知识储备

四 高阶函数

五 函数嵌套

六 闭包

七 无参装饰器

八 装饰器应用示例

一 什么是装饰器

器即函数

装饰即修饰,意指为其他函数添加新功能

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

二 装饰器需要遵循的原则

1.不修改被装饰函数的源代码(开放封闭原则)

2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式

三 实现装饰器知识储备

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

四 高阶函数

高阶函数定义:

1.函数接收的参数是一个函数名

2.函数的返回值是一个函数名

3.满足上述条件任意一个,都可称之为高阶函数

def foo():

print(‘我的函数名作为参数传给高阶函数‘)

def gao_jie1(func):

print(‘我就是高阶函数1,我接收的参数名是%s‘ %func)

func()

def gao_jie2(func):

print(‘我就是高阶函数2,我的返回值是%s‘ %func)

return func

gao_jie1(foo)

gao_jie2(foo)

#高阶函数应用1:把函数当做参数传给高阶函数

import time

def foo():

print(‘from the foo‘)

def timmer(func):

start_time=time.time()

func()

stop_time=time.time()

print(‘函数%s 运行时间是%s‘ %(func,stop_time-start_time))

timmer(foo)

#总结:我们确实为函数foo增加了foo运行时间的功能,但是foo原来的执行方式是foo(),现在我们需要调用高阶函数timmer(foo),改变了函数的调用方式

#高阶函数应用2:把函数名当做参数传给高阶函数,高阶函数直接返回函数名

import time

def foo():

print(‘from the foo‘)

def timmer(func):

start_time=time.time()

return func

stop_time=time.time()

print(‘函数%s 运行时间是%s‘ %(func,stop_time-start_time))

foo=timmer(foo)

foo()

#总结:我们确实没有改变foo的调用方式,但是我们也没有为foo增加任何新功能

高阶函数总结

1.函数接收的参数是一个函数名

  作用:在不修改函数源代码的前提下,为函数添加新功能,

  不足:会改变函数的调用方式

2.函数的返回值是一个函数名

  作用:不修改函数的调用方式

  不足:不能添加新功能

五 函数嵌套

1 def father(name):

2     print(‘from father %s‘ %name)

3     def son():

4         print(‘from son‘)

5         def grandson():

6             print(‘from grandson‘)

7         grandson()

8     son()

9

10 father(‘tom‘)

六 闭包

1 ‘‘‘

2 闭包:在一个作用域里放入定义变量,相当于打了一个包

3 ‘‘‘

4 def father(name):

5     def son():

6         # name=‘jack‘

7         print(‘is [%s]‘ %name)

8         def grandson():

9             # name=‘wupeiqi‘

10             print(‘is [%s]‘ %name)

11         grandson()

12     son()

13

14 father(‘jack‘)

七 无参装饰器

无参装饰器=高级函数+函数嵌套

基本框架

1 #这就是一个实现一个装饰器最基本的架子

2 def timer(func):

3     def wrapper():

4         func()

5     return wrapper

加上参数

1 def timer(func):

2     def wrapper(*args,**kwargs):

3         func(*args,**kwargs)

4     return wrapper

加上功能

1 import time

2 def timer(func):

3     def wrapper(*args,**kwargs):

4         start_time=time.time()

5         func(*args,**kwargs)

6         stop_time=time.time()

7         print(‘函数[%s],运行时间是[%s]‘ %(func,stop_time-start_time))

8     return wrapper

加上返回值

1 import time

2 def timer(func):

3     def wrapper(*args,**kwargs):

4         start_time=time.time()

5         res=func(*args,**kwargs)

6         stop_time=time.time()

7         print(‘函数[%s],运行时间是[%s]‘ %(func,stop_time-start_time))

8         return res

9     return wrapper

使用装饰器

1 def cal(array):

2     res=0

3     for i in array:

4         res+=i

5     return res

6

7 cal=timer(cal)

8 cal(range(10))

语法糖@

1 @timer  #@timer就等同于cal=timer(cal)

2 def cal(array):

3     res=0

4     for i in array:

5         res+=i

6     return res

7

8 cal(range(10))

八 装饰器应用示例

user_list=[

{‘name‘:‘alex‘,‘passwd‘:‘123‘},

{‘name‘:‘linhaifeng‘,‘passwd‘:‘123‘},

{‘name‘:‘wupeiqi‘,‘passwd‘:‘123‘},

{‘name‘:‘yuanhao‘,‘passwd‘:‘123‘},

]

current_user={‘username‘:None,‘login‘:False}

def auth_deco(func):

def wrapper(*args,**kwargs):

if current_user[‘username‘] and current_user[‘login‘]:

res=func(*args,**kwargs)

return res

username=input(‘用户名: ‘).strip()

passwd=input(‘密码: ‘).strip()

for index,user_dic in enumerate(user_list):

if username == user_dic[‘name‘] and passwd == user_dic[‘passwd‘]:

current_user[‘username‘]=username

current_user[‘login‘]=True

res=func(*args,**kwargs)

return res

break

else:

print(‘用户名或者密码错误,重新登录‘)

return wrapper

@auth_deco

def index():

print(‘欢迎来到主页面‘)

@auth_deco

def home():

print(‘这里是你家‘)

def shopping_car():

print(‘查看购物车啊亲‘)

def order():

print(‘查看订单啊亲‘)

print(user_list)

# index()

print(user_list)

home()

user_list=[

{‘name‘:‘tom‘,‘passwd‘:‘123‘},

{‘name‘:‘jack‘,‘passwd‘:‘123‘},

]

current_user={‘username‘:None,‘login‘:False}

def auth(auth_type=‘file‘):

def auth_deco(func):

def wrapper(*args,**kwargs):

if auth_type == ‘file‘:

if current_user[‘username‘] and current_user[‘login‘]:

res=func(*args,**kwargs)

return res

username=input(‘用户名: ‘).strip()

passwd=input(‘密码: ‘).strip()

for index,user_dic in enumerate(user_list):

if username == user_dic[‘name‘] and passwd == user_dic[‘passwd‘]:

current_user[‘username‘]=username

current_user[‘login‘]=True

res=func(*args,**kwargs)

return res

break

else:

print(‘用户名或者密码错误,重新登录‘)

elif auth_type == ‘ldap‘:

print(‘auth‘)

res=func(*args,**kwargs)

return res

return wrapper

return auth_deco

#auth(auth_type=‘file‘)就是在运行一个函数,然后返回auth_deco,所以@auth(auth_type=‘file‘)

#就相当于@auth_deco,只不过现在,我们的auth_deco作为一个闭包的应用,外层的包auth给它留了一个auth_type=‘file‘参数

@auth(auth_type=‘ldap‘)

def index():

print(‘欢迎来到主页面‘)

@auth(auth_type=‘ldap‘)

def home():

print(‘home‘)

def shopping_car():

print(‘shopping‘)

def order():

print(‘check order‘)

# print(user_list)

index()

# print(user_list)

home()

时间: 2024-10-09 14:35:55

第九篇 装饰器的相关文章

python笔记第九天 装饰器

装饰器 装饰器是这样一种设计模式:如果一个类希望添加其他类的一些功能,而不希望通过继承或是直接修改源代码实现,那么可以使用装饰器模式.简单来说Python中的装饰器就是指某些函数或其他可调用对象,以函数或类作为可选输入参数,然后返回函数或类的形式.通过这个在Python2.6版本中被新加入的特性可以用来实现装饰器设计模式. 顺便提一句,在继续阅读之前,如果你对Python中的闭包(Closure)概念不清楚,请查看本文结尾后的附录,如果没有闭包的相关概念,很难恰当的理解Python中的装饰器.

Python初探第二篇-装饰器和迭代器,生成器

一,装饰器 1,概念 装饰器就是给已有的模块添加新的功能,如登录验证功能,运行时间功能等.本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能 2,理论基础 要想实现装饰器的功能,我们需要三个理论基础:函数闭包+函数嵌套+高阶函数.我们通过为如下模块加入统计运行时间的装饰器来讲解如何使用 import time def test_func(): fo

函数篇 ---> 装饰器与内置函数

装饰器: 从名字上来看,装饰器就是用来装饰内容的一个工具.本质上是一个闭包 在开发中,装饰器必须要遵守开放封闭原则:对扩展开放,对修改源代码封闭. 在装饰器中,有一个很重要的工具就是@,称之为语法糖,语法糖的本质就是:被装饰的函数名 = 装饰器的名字(被装饰的函数名) 在装饰器的应用上,有一个很简单的例子 计算简易的函数运行时间 import time # 导入time模块 print(time.time()) # 获取时间戳 start_time = time.time() # 开始时间 de

函数篇--装饰器

1.装饰器的作用 在 不修改被装饰对象的源代码:不修改被装饰对象的调用方式: 为被封装的对象添加新的功能. 例如下列: test函数为事先封装好的一个功能,但是在后期迭代的过程中,希望能为该功能增加一个计算运行时间的功能.这时候,装饰器就起到了作用了. def test(s): print('%s is testing'%s) time.sleep(3) def timer(func): def wrapper(*args, **kwargs): start = time.time() res

黑马程序员系列第九篇 类加载器

ASP.Net+Android+IOS开发  .Net培训.期待与您交流! 推荐阅读相关书籍<深入java虚拟机> 目录:1.java.lang.ClassLoader类介绍      2.类加载器的结构     3.加载类的过程     4.自定义类加载器 类加载器负责加载 Java 类的字节代码到 Java 虚拟机中. 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一.它使得 Java 类可以被动态加载到 Java 虚拟机中并执行. Java 虚拟机使用 Jav

说说设计模式~装饰器模式(Decorator)~多功能消息组件的实现

返回目录 为何要设计多功能消息组件 之前写过一篇装饰器模式的文章,感觉不够深入,这次的例子是实现项目中遇到的,所以把它拿出来,再写写,之前也写过消息组件的文章,主要采用了策略模式实现的,即每个项目可以通过配置进行一种消息的订制,如,你可以订制email,sms,rtx,qq等,但不能同时采用多种机制完成消息的发送,这在一些情况下是没有问题的,但有时,我们也需要同时为客户提供多种消息的推送,这在目前还是挺现时的,如在用户下单后,同时为它发email 和短信进行通过,并对每个订单的过程进行跟踪并通知

python装饰器装饰原理探秘

最近一直没抽出时间来写博客,这篇博客在草稿箱里面躺了好久了,一直都只有一个标题. 现在终于要开始写了. 为什么要写这个篇文章 前段时间整天盯着python学习 群,发现好多同学对python很多内容并不是很理解,觉得有必要分享自己这段时间通过学习实践总结出来的一些东西. 写的过程中我会将一些自己理解的内容直接用文字写出来,感觉没必要去复制粘贴一些概念性的东西,若存在有理解错误的地方,欢迎各位在留言指出一起讨论提高,SO 废话不说开写吧. 什么是装饰器 装饰器(Decorator):个人理解装饰器

Python基础篇【第九篇】:剖析装饰器

装饰器:装饰器:装饰器的语法以@开头,然后是装饰器函数的名字和可选的参数,紧跟着装饰器声明的是被修饰的函数和装饰函数的可选参数.剖析装饰器: #!/usr/bin/env python3 ''' 装饰器:装饰器的语法以@开头,然后是装饰器函数的名字和可选的参数,紧跟着装饰器声明的是被修饰的函数和装饰函数的可选参数. 表现形式: def outer(): def inner(): print("xxx") return test return inner @outer def f1():

Python进阶【第九篇】装饰器

什么是装饰器 装饰器本身就是函数,并且为其他函数添加附加功能 装饰器的原则:1.不修改被装饰对象的源代码  2.不修改被装饰对象的调用方式装饰器=高阶函数+函数嵌套+闭包 # res=timmer(test)  #返回的是wrapper的地址 # res()  #执行的是wrapper() # test=timmer(test)  #返回的是wrapper的地址 # test()  #执行的是wrapper() #  @timmer  就相当于 test=timmer(test) # #搭一个高