一、装饰器
装饰器:装饰函数和类,作用:扩展增强函数和类的功能
@:语法糖
二、装饰器的分类
三、装饰器函数定义及应用
函数:封装代码最小单元,提供代码复用性
装饰器函数利用函数的一些特征:
1、函数可以作为参数
3、函数可以作为变量
2、函数也可以返回函数
装饰器函数实质:调用装饰函数的内置方法
装饰器函数可以装饰所有的函数(有参数,没参数)
import time""""""# 装饰器函数# 其他函数只要被装饰器函数装饰即可def runTime(func):"""装饰函数原来功能+扩展的功能:统计每个函数的耗时多久:return:"""def wrapper(*args,**kwargs):start = time.time()# 原来功能func(*args,**kwargs) # 原来功能end = time.time()cost = end ‐ startprint(f"统计函数[{func.__name__}]总共耗时{cost}秒")return wrapper@runTimedef welcome_vip():"""被装饰器函数"""print("欢迎来到码尚学院VIP课堂")time.sleep(1)@runTimedef sum(*args):sum=0for num in args:sum+=numprint(f"求和:{sum}")return sumwelcome_vip() #实质:执行装饰函数的内置方法sum(1,2,3,4,5,6,7,8,9,10)
四、装饰器类
装饰器类的实质:
调用装饰类中的call内置函数
"""装饰器类"""import time# 定义装饰类‐‐‐‐‐》本质类 作用:原来功能+扩展功能class A:# 原来功能 self._func()def __init__(self,func):self._func=func#扩展功能def __call__(self,*args,**kwargs):"""__call__函数:实例化对象():return:"""start = time.time()# 原来功能self._func() # 原来功能end = time.time()cost = end ‐ startprint(f"统计函数总共耗时{cost}秒")@Adef welcome_vip():"""被装饰器函数"""print("欢迎来到码尚学院VIP课堂")welcome_vip()
五、装饰器应用场景
六、反射
把字符串映射到实例的变量或者实例的方法,然后可以去进行调用、修改操作
反射四个重要的方法:
1、getattr 获取对象属性/方法
2、hasattr 判断对象是否有对应的属性
3、delattr 删除指定属性
4、setattr 为对象设置内容
class M211Vip:def __init__(self,name,wkage):self.name=nameself.wkage=wkagedef welcome(self):print("恭喜加入组织")def learning(self):print("正在跟其他人拉开差距......")def mylearning():print("正在自学中....")if __name__ == '__main__':bo=M211Vip("波","3")print(bo.name,bo.wkage) # 实例属性name=getattr(bo,"name") # 把字符串映射到实例的变量wkage=getattr(bo,"wkage")method=getattr(bo,"learning") # 映射到实例的方法print(name,type(name))print(wkage, type(wkage))print(method,type(method))# 执行方法method()if hasattr(bo,"learning"):print("正在学习中....")else:print("正在加班中....")# 2、hasattr判断对象是否有对应的属性if hasattr(bo,"name"):print("有name属性....")else:print("没name属性....")#setattr 设置对象的内容(属性/方法)setattr(bo,"name","波波") #修改对象的属性name=getattr(bo,"name")print(f"被修改的对象属性:{name}")# 类的外部的函数映射到类里面的方法setattr(bo,"mylearning",mylearning)bo.mylearning()getattr(bo,"mylearning")()# 4、delattr删除指定属性delattr(bo,"wkage")print(bo.wkage)
#实现反射实现登录、退出、注销‐‐‐‐‐》关键字驱动# excel ‐‐‐> open_brower close click inputclass mashang:def login(self):print("正在登录.....")def loginout(self):print("正在退出.....")def register(self):print("正在注册.....")def run(self):"""1 login2、loginout3、register:return:"""fucslist=["login","loginout","register"]num=int(input("请你输入操作数字:"))methods=fucslist[num‐1]action=getattr(self,methods)action()if __name__ == '__main__':mashang().run()
