美文网首页
day07-装饰器decorator

day07-装饰器decorator

作者: 落入粪池的凤凰 | 来源:发表于2022-02-11 09:51 被阅读0次
    
    from ast import arg
    import time
    from turtle import st
    from typing import Any
    
    
    def caltime(func):
        def fun_in(*args,**kwargs):
            st = time.time()
            func(args,kwargs)
            et = time.time()
            print("消耗的时间是{0}".format(et-st))
        return fun_in
    
    # printnum = caltime(printnum)
    # 如果写一个通用版本,装饰器内部函数参数最好用(*args,**kwargs),
    @caltime 
    def printnum(*args,**kwargs):
        print(args,kwargs)
     
    
    def fun_out1(func):
        def func_in1(*args,**kwargs):
            print(1)
            func(*args,**kwargs)
        return func_in1
    
    
    def fun_out2(func):
        def func_in2(*args,**kwargs):
            print(2)
            func(*args,**kwargs)
        return func_in2
    
    
    @fun_out1
    @fun_out2
    def test():
        print("test")
    
    
    #!带有装饰器参数的需要再最外层再嵌套一层
    #例如网络请求的装饰器
    def net_param(method:str,query:str=None):
        def func_out(func):
            def func_in(*args,**kwargs):
                print("正在进行{0}网络请求".format(method,))
                if args or kwargs:
                    print(args,kwargs)
                func()
            return func_in
        return func_out
    
    
    @net_param(method="Get")
    def r_request():
        print("网络1回调结果")
        
    
    @net_param(method="Post")
    def r_request2():
        print("网络2回调结果")
        
        
    def a()->str:
        return "12"    
    
    #? 类装饰器
    class Func:
        def __init__(self,func):
            self.func = func
        def __call__(self, *args: Any, **kwds: Any):
            #类似于func_in作用
            print("开始前验证")
            self.func()
    
    @Func
    def cal():
        print("进行工作")
    
    
    if __name__ == "__main__":
        # test() 
        # 说明 执行的时候是离着函数越近的装饰器越先执行
        # test
        # 2
        # 1
        # r_request()
        # r_request2()
        """
        正在进行Get网络请求
        正在进行Post网络请求
        网络1回调结果
        网络2回调结果
        """        
        cal()
        """
        开始前验证
        进行工作
        """    
     
    

    相关文章

      网友评论

          本文标题:day07-装饰器decorator

          本文链接:https://www.haomeiwen.com/subject/zjjakrtx.html