-
什么是装饰器
装饰器指的是为被装饰对象添加新功能的工具
装饰器本身可以是任意可调用对象
被装饰对象本身也可以是任意可调用对象
-
为什么要用装饰器
开放封闭原则:对修改封闭,对扩展开放
装饰器的实现原则:
-
不能修改被装饰对象的源代码
-
不能修改被装饰对象的调用方式
装饰器的目的:
就是在遵循原则1和原则2的原则的条件的情况下实现为被装饰对象添加新功能。
-
-
怎么用装饰器
# 装饰器的基本框架 def outer(func): def wrapper(*args, **kwargs): # 设置可变形参可以接收任意值 # 此处可以添加装饰内容(添加新功能) res = func(*args, **kwargs) # 此处可以添加装饰内容(添加新功能),即被装饰对象前后皆可添加功能语句 return res # 返回被装饰对象的值,保证与被装饰对象功能的一致性 return wrapper @outer # 语法糖,本质上是将outer(func1)的内存地址绑定给新的func1,func1 = outer(func1) def func1(): pass func() # 调用函数,此时的函数就是被装饰过的函数
语法糖:在被装饰对象正上方加入@装饰器名称
-
装饰器使用实例
-
实例1
-
# 实现在被装饰对象基础上添加计时功能 import time def timer(func): def wrapper(*args, **kwargs): t1 = time.time() # 记录被装饰对象执行前时间 res = func(*args, **kwargs) t2 = time.time() # 被装饰对象执行完时间 print(t2 - t1) return res return wrapper @timer def welcome(): time.sleep(2) print('welcome to China') welcome()
-
实例2
# 给被装饰对象添加登录认证功能 def login(func): def wrapper(*args, **kwargs): while True: name = input("input your name:").strip() pwd = input("input your password:").strip() if name == 'Jason' and pwd == '123': res = func(*args, **kwargs) return res else: print("name or password error!") return wrapper @login def welcome(name): print("welcome %s to China !" % name) welcome('Jason')
所有评论(0)