一、装饰器
装饰器:装饰函数和类,作用:扩展增强函数和类的功能
@:语法糖
二、装饰器的分类
三、装饰器函数定义及应用
函数:封装代码最小单元,提供代码复用性
装饰器函数利用函数的一些特征:
1、函数可以作为参数
3、函数可以作为变量
2、函数也可以返回函数
装饰器函数实质:调用装饰函数的内置方法
装饰器函数可以装饰所有的函数(有参数,没参数)
import time
"""
"""
# 装饰器函数
# 其他函数只要被装饰器函数装饰即可
def runTime(func):
"""
装饰函数
原来功能+扩展的功能:统计每个函数的耗时多久
:return:
"""
def wrapper(*args,**kwargs):
start = time.time()
# 原来功能
func(*args,**kwargs) # 原来功能
end = time.time()
cost = end ‐ start
print(f"统计函数[{func.__name__}]总共耗时{cost}秒")
return wrapper
@runTime
def welcome_vip():
"""被装饰器函数"""
print("欢迎来到码尚学院VIP课堂")
time.sleep(1)
@runTime
def sum(*args):
sum=0
for num in args:
sum+=num
print(f"求和:{sum}")
return sum
welcome_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 ‐ start
print(f"统计函数总共耗时{cost}秒")
@A
def welcome_vip():
"""被装饰器函数"""
print("欢迎来到码尚学院VIP课堂")
welcome_vip()
五、装饰器应用场景
六、反射
把字符串映射到实例的变量或者实例的方法,然后可以去进行调用、修改操作
反射四个重要的方法:
1、getattr 获取对象属性/方法
2、hasattr 判断对象是否有对应的属性
3、delattr 删除指定属性
4、setattr 为对象设置内容
class M211Vip:
def __init__(self,name,wkage):
self.name=name
self.wkage=wkage
def 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 input
class mashang:
def login(self):
print("正在登录.....")
def loginout(self):
print("正在退出.....")
def register(self):
print("正在注册.....")
def run(self):
"""
1 login
2、loginout
3、register
:return:
"""
fucslist=["login","loginout","register"]
num=int(input("请你输入操作数字:"))
methods=fucslist[num‐1]
action=getattr(self,methods)
action()
if __name__ == '__main__':
mashang().run()