一、装饰器

装饰器:装饰函数和类,作用:扩展增强函数和类的功能
@:语法糖

二、装饰器的分类

两大类:装饰器函数和装饰器类

三、装饰器函数定义及应用

函数:封装代码最小单元,提供代码复用性
装饰器函数利用函数的一些特征:
1、函数可以作为参数
3、函数可以作为变量
2、函数也可以返回函数
装饰器函数实质:调用装饰函数的内置方法
装饰器函数可以装饰所有的函数(有参数,没参数)

  1. import time
  2. """
  3. """
  4. # 装饰器函数
  5. # 其他函数只要被装饰器函数装饰即可
  6. def runTime(func):
  7. """
  8. 装饰函数
  9. 原来功能+扩展的功能:统计每个函数的耗时多久
  10. :return:
  11. """
  12. def wrapper(*args,**kwargs):
  13. start = time.time()
  14. # 原来功能
  15. func(*args,**kwargs) # 原来功能
  16. end = time.time()
  17. cost = end start
  18. print(f"统计函数[{func.__name__}]总共耗时{cost}秒")
  19. return wrapper
  20. @runTime
  21. def welcome_vip():
  22. """被装饰器函数"""
  23. print("欢迎来到码尚学院VIP课堂")
  24. time.sleep(1)
  25. @runTime
  26. def sum(*args):
  27. sum=0
  28. for num in args:
  29. sum+=num
  30. print(f"求和:{sum}")
  31. return sum
  32. welcome_vip() #实质:执行装饰函数的内置方法
  33. sum(1,2,3,4,5,6,7,8,9,10)

四、装饰器类

装饰器类的实质:
调用装饰类中的call内置函数

  1. """
  2. 装饰器类
  3. """
  4. import time
  5. # 定义装饰类‐‐‐‐‐》本质类 作用:原来功能+扩展功能
  6. class A:
  7. # 原来功能 self._func()
  8. def __init__(self,func):
  9. self._func=func
  10. #扩展功能
  11. def __call__(self,*args,**kwargs):
  12. """
  13. __call__函数:实例化对象()
  14. :return:
  15. """
  16. start = time.time()
  17. # 原来功能
  18. self._func() # 原来功能
  19. end = time.time()
  20. cost = end start
  21. print(f"统计函数总共耗时{cost}秒")
  22. @A
  23. def welcome_vip():
  24. """被装饰器函数"""
  25. print("欢迎来到码尚学院VIP课堂")
  26. welcome_vip()

五、装饰器应用场景

常见的场景:授权及日志的收集

六、反射

把字符串映射到实例的变量或者实例的方法,然后可以去进行调用、修改操作
反射四个重要的方法:
1、getattr 获取对象属性/方法
2、hasattr 判断对象是否有对应的属性
3、delattr 删除指定属性
4、setattr 为对象设置内容

  1. class M211Vip:
  2. def __init__(self,name,wkage):
  3. self.name=name
  4. self.wkage=wkage
  5. def welcome(self):
  6. print("恭喜加入组织")
  7. def learning(self):
  8. print("正在跟其他人拉开差距......")
  9. def mylearning():
  10. print("正在自学中....")
  11. if __name__ == '__main__':
  12. bo=M211Vip("波","3")
  13. print(bo.name,bo.wkage) # 实例属性
  14. name=getattr(bo,"name") # 把字符串映射到实例的变量
  15. wkage=getattr(bo,"wkage")
  16. method=getattr(bo,"learning") # 映射到实例的方法
  17. print(name,type(name))
  18. print(wkage, type(wkage))
  19. print(method,type(method))
  20. # 执行方法
  21. method()
  22. if hasattr(bo,"learning"):
  23. print("正在学习中....")
  24. else:
  25. print("正在加班中....")
  26. # 2、hasattr判断对象是否有对应的属性
  27. if hasattr(bo,"name"):
  28. print("有name属性....")
  29. else:
  30. print("没name属性....")
  31. #setattr 设置对象的内容(属性/方法)
  32. setattr(bo,"name","波波") #修改对象的属性
  33. name=getattr(bo,"name")
  34. print(f"被修改的对象属性:{name}")
  35. # 类的外部的函数映射到类里面的方法
  36. setattr(bo,"mylearning",mylearning)
  37. bo.mylearning()
  38. getattr(bo,"mylearning")()
  39. # 4、delattr删除指定属性
  40. delattr(bo,"wkage")
  41. print(bo.wkage)
  1. #实现反射实现登录、退出、注销‐‐‐‐‐》关键字驱动
  2. # excel ‐‐‐> open_brower close click input
  3. class mashang:
  4. def login(self):
  5. print("正在登录.....")
  6. def loginout(self):
  7. print("正在退出.....")
  8. def register(self):
  9. print("正在注册.....")
  10. def run(self):
  11. """
  12. 1 login
  13. 2、loginout
  14. 3、register
  15. :return:
  16. """
  17. fucslist=["login","loginout","register"]
  18. num=int(input("请你输入操作数字:"))
  19. methods=fucslist[num1]
  20. action=getattr(self,methods)
  21. action()
  22. if __name__ == '__main__':
  23. mashang().run()

作业

作业答案.txt