文章内容:
1.装饰器的意义,装饰器优势的体现
2.如何使用装饰器为函数增加一个功能,并且不会改变函数内部的实现
3.语法糖
4.被装饰函数有一个或者多个参数的情况,装饰器如何支持
5.被装饰函数含有关键字参数的情况,装饰器如何支持
6.装饰器最终的定义形式
"""
装饰器
开闭原则:对修改是封闭的,对扩展是开放的
用装饰器去解决问题
如果想为一个函数增加一个功能,比如时间,并且不想去改变函数内部的实现
装饰器的优势的体现
比如装饰器里面有很复杂的代码,不用装饰器,就需要加在每一个函数里面
"""
import time
def f1():
print('Hello')
def f2():
print('Hello')
print(time.time())
f1()
print(time.time())
f2()
"""
1535815321.3426168
Hello
1535815321.3426168
Hello
"""
def print_current_time(func):
print(time.time())
func()
print_current_time(f1)
print_current_time(f2)
"""
1535815336.2754712
Hello
1535815336.2754712
Hello
"""
#############################################装饰器模式
import time
def decortor(func):
def wrapper():
print(time.time())
func()
return wrapper
def f1():
print('Hello')
f=decortor(f1)
f()
"""
1535815360.070832
Hello
"""
#################################python中装饰器的特点,意义所在,@符号,语法糖
"""
语法糖:
指计算机语言中添加的某种语法,这种语法对语言的功能并没有什么影响,但是很方便使用
使用语法糖能够增加程序的可读性,减少程序代码出错的机会
"""
import time
def decortor(func):#装饰器
def wrapper():
print(time.time())
func()
return wrapper
@decortor#像是装饰物一样的东西,@语法糖
def f1():#被装饰的函数
print('Hello')
f1()
"""
1535815943.6052084
Hello
"""
###########################################被装饰的函数有参数的情况
"""
装饰器的变化
"""
#一个参数的情况
def decortor(func):
def wrapper(name):
print(time.time())
func(name)
return wrapper
@decortor
def f1(name):#一个参数
print('Hello'+name)
f1('X')
"""
1535817016.403569
HelloX
"""
#被装饰函数含有多个参数的情况,装饰器如何支持被装饰函数不同个数参数
def decortor(func):
def wrapper(*ages):#可变参数,ages仅仅只是一个通用的叫法
print(time.time())
func(*ages)
return wrapper
@decortor
def f1(name):#一个参数的情况
print('Hello'+name)
@decortor
def f2(name1,name2):#两个参数的情况
print('Hello'+name1)
print('Hello'+name2)
f1('X')
f2('X','F')
"""
1535817762.0832193
HelloX
1535817762.0832193
HelloX
HelloF
"""
#被装饰函数含有关键字参数的情况
def f3(name1,name2,**kw):#普通情况可以打印出来
print('Hello'+name1)
print('Hello'+name2)
print(kw)
f3('X','F',a=1,b=2,c='34')
"""
HelloX
HelloX
{'a': 1, 'b': 2, 'c': '34'}
"""
def decortor(func):
def wrapper(*ages):
print(time.time())
func(*ages)
return wrapper
@decortor
def f1(name):
print('Hello'+name)
@decortor
def f2(name1,name2):
print('Hello'+name1)
print('Hello'+name2)
@decortor
def f3(name1,name2,**kw):#被装饰时出错
print('Hello'+name1)
print('Hello'+name2)
print(kw)
f1('X')
f2('X','F')
f3('X','F',a=1,b=2,c='34')#TypeError: wrapper() got an unexpected keyword argument 'a'
"""
*ages不能兼容关键字参数
解决办法
写好了的装饰器如下
装饰器最终的定义形式
并不是一个被装饰函数只能有一个装饰器,而是可以有多个装饰器,可以@多个
"""
def decortor(func):
def wrapper(*ages,**kw):#补上关键字参数,同ages,kw只是形参,一个叫法
print(time.time())
func(*ages,**kw)#补上
return wrapper
@decortor
def f1(name):
print('Hello'+name)
@decortor
def f2(name1,name2):
print('Hello'+name1)
print('Hello'+name2)
@decortor
def f3(name1,name2,**kw):
print('Hello'+name1)
print('Hello'+name2)
print(kw)
f1('X')
f2('X','F')
f3('X','F',a=1,b=2,c='34')
"""
1535818887.5245907
HelloX
1535818887.525591
HelloX
HelloF
1535818887.525591
HelloX
HelloF
{'a': 1, 'b': 2, 'c': '34'}
"""