第十四天
装饰器-开放封闭原则
在不改变原函数的代码以及调用方式的前提下,为其增加新功能
开放:对代码的扩展开放的
类比游戏:更新地图,加新枪 ,加新英雄
封闭:对源码的修改是封闭的
类比游戏:开枪 扔雷 不会改变
装饰器就是一个函数
功能:
加一个测试函数运行时间的函数
def index():
    print("我爱小屋")
import time
def timer(f):
    def  inner():
        start=time.time()
        f()
        time.sleep(3)
        end = time.time()
        print(f'测试的时间是{end-start}')
    return inner
index=timer(index)
index()
装饰器标准版
import time
def timer(f):
    def  inner():
        start=time.time()
        f()
        time.sleep(3)
        end = time.time()
        print(f'测试的时间是{end-start}')
    return inner
@timer   #index=timer(index)
def index():
    print("我爱小屋")
index()
当index(被装饰) 有返回值
import time
def timer(f):
    def  inner():
        start=time.time()
        f=f()
        time.sleep(3)
        end = time.time()
        print(f'测试的时间是{end-start}')
        return f
    return inner
@timer   #index=timer(index)
def index():
    print("我爱小屋")
    return 666
index()
当index(被装饰) 有参数
import time
def timer(f):
    def  inner(n):
        start=time.time()
        f=f(n)
        time.sleep(3)
        end = time.time()
        print(f'测试的时间是{end-start}')
        return f
    return inner
@timer   #index=timer(index)
def index(name):
    print("我爱小屋")
    return 666
index(n)
当index(被装饰) 有多个参数-最标准的
import time
def timer(f):
    def  inner(*args,**kwargs):
        start=time.time()
        f=f(*args,**kwargs)
        time.sleep(3)
        end = time.time()
        print(f'测试的时间是{end-start}')
        return f
    return inner
@timer   #index=timer(index)
def index(name,age):
    print(f'{name}今年{age}岁')
    return 666
index(n)
模板
def wrapper(f):
    def inner():
        
        
        
        **添加额外的功能 执行被装饰函数前的操作 **
        
        
        
        ret = f(*args,**kwargs)
        
        
        **添加额外的功能 执行被装饰函数后的操作 **
            
            
            return ret
    return inner
装饰器的应用
def auth(f):
    def inner(*args,**kwargs):
        if status_dict["status"]:
            ret=f(*args,**kwargs)
            return ret
        else:
            username=input("请输入用户名").strip()
            password=input("请输入密码").strip()
            if username=="xiaowu" and password=="woaini":
                print("登陆成功")
                status_dict["status"]=True
                ret = f(*args, **kwargs)
                return ret
            else:
                print("登录失败")
    return inner
status_dict={
    "status":False
}
def login():
    print("请完成登陆功能")
@auth
def article():
    print("欢迎访问文章")
@auth
def comment():
    print("欢迎访问评论")
@auth
def dariy():
    print("欢迎访问日记")
article()
comment()
dariy()
    对代码有疑问欢迎交流 
一个python爱好者 :
微信:at8685b
                    
                
                
            
        
浙公网安备 33010602011771号