9-装饰器
装饰器基础
-
使用装饰器可以增加程序的灵活性,减少耦合度,适合使用在用户登陆检查、日志处理等方面
-
装饰器语法
-
# Python装饰器语法: def out(f): def inner(): f() print('这里写增加的装饰功能') return inner
-
闭包
-
装饰器内部调用函数
-
函数的上下添加装饰
-
-
函数调用
- house = out(house)
- # print(house._name_) # inner,house指向inner函数
- house指向的函数是装饰器的内部函数(inner)
- house = out(house)
-
给函数加装饰器
- @装饰器
通用装饰器
-
通用指的是带通用参数
-
通用装饰器语法
-
def outer2(f): def inner(*args, **kwargs): print('开始唱歌了') r = f(*args, **kwargs) print('唱完了') return r return inner @outer2 def sing2(singer, song, a): print(singer, '唱:', song, a) return 'Nice' result = sing2('贾玲', '老女孩', a=1) print(result) ''' 开始唱歌了 贾玲 唱: 老女孩 1 唱完了 Nice '''
-
如果原函数有返回值,那么装饰器函数也要有返回值进行返回,这样才能确保对原函数不做修改
-
-
装饰器调用时使用参数
-
# 装饰器调用时使用参数,相当于多加了一个参数层 def outer(is_hello): def inner(f): def inner_inner(*args, **kwargs): if is_hello == 'hello': print('hello Python') return f(*args, **kwargs) else: return f(*args, **kwargs) return inner_inner return inner @outer('hello') # 加装饰器 def f_temp(*args, **kwargs): print(*args, **kwargs) # 调用 f_temp('你好,世界') ''' hello Python 你好,世界 '''
-
如果装饰器在调用时使用了参数,那么装饰器函数只会使用这些参数进行调用,因此需要返回一个新的装饰器函数,这样就与普通的装饰器一致
-
栈和队列
-
栈
-
栈:一种数据结构
-
特点:先进后出,后进先出
-
列表可以实现栈结构,控制只在一端(只在列表末尾)插入append和取出pop
-
from queue import LIFOQueue
-
from queue import LifoQueue stack = LifoQueue(maxsize=3) stack.put('hello') stack.put('world') print(stack.get()) # world print(stack.get()) # hello
-
-
-
队列
-
队列:一种数据结构
-
特点:先进先出,后进后出,类似排队
-
创建队列
-
# 创建队列 import collections.abc queue = collections.deque() print(queue) # deque([])
-
-
入队列:append
-
出队列:popleft
-