装饰器
装饰器英文Decorator,自身是一个函数,用来包装其它的函数,实现在不改变原来代码的情况下,增加新的功能,返回一个修改后的函数对象,
装饰器功能:
1、装饰器也是函数
2、在不改变原有代码的情况下,增加新的功能
3、符合开放-封闭原则
在学习装饰器之前,我们复习一下函数的相关概念
理解函数也是变量
当我们执行函数不加括号的时候,输出函数的内存地址:
def foo(): print(‘hello‘) print(foo) # 输出 <function foo at 0x0000000002CBCBF8>
当我们加上括号后,输出
def foo(): print(‘hello‘) foo() # 输出 hello
高阶函数:
1、把一个函数名当做实参传给另外一个函数
def bar(): print(‘bar‘) def t1(func): func() t1(bar) # 输出 bar
2、返回值中包含函数名
def bar(): print(‘bar‘) def t1(func): return func print(t1(bar)) # 输出 <function bar at 0x000000000303CBF8>
函数嵌套
def foo(): print(‘foo‘) def bar(): print(‘bar‘) bar() foo()
前面做了那么多的铺垫,都是为了后边的装饰器,装饰器的组成离不开高阶函数+函数嵌套
无参数装饰器
def logger(func): def inner(): print(‘logger start‘) res = func() print(‘logger stop‘) return res return inner @logger def test1(): print(‘test1‘) def test2(): print(‘test2‘) test1() test2() # 输出 logger start test1 logger stop test2
带固定参数装饰器
def logger(func): def inner(arg): print(‘logger start‘) res = func(arg) print(‘logger stop‘) return res return inner @logger def test1(): print(‘test1‘) @logger def test2(name): print(‘test2‘, name) # test1() test2(‘chen‘) # 输出 logger start test2 chen logger stop
但是这个时候我的test1函数不能调用了,因为它没有参数,怎么解决,让test1没有参数,test2带参数都可以是用呢?
非固定参数装饰器
def logger(func): def inner(*args, **kwargs): print(‘logger start‘) res = func(*args, **kwargs) print(‘logger stop‘) return res return inner @logger def test1(): print(‘test1‘) @logger def test2(name): print(‘test2‘, name) test1() test2(‘chen‘)
终极版
def logger(write_type): # print(write_type) def outer_wrapper(func): def inner(*args, **kwargs): if write_type == ‘file‘: print(‘logger start‘) res = func(*args, **kwargs) print(‘logger stop‘) return res elif write_type == ‘db‘: print(‘no support db‘) return inner return outer_wrapper @logger(write_type=‘file‘) def test1(): print(‘test1‘) return ‘return test1‘ @logger(write_type=‘db‘) def test2(name): print(‘test2‘, name) a = test1() print(a) test2(‘chen‘) # 输出 logger start test1 logger stop return test1 no support db
生成器
1、生成器只有在调用时候,才会生成相应的数据
2、
json和pickle
时间: 2024-10-23 12:06:01