day07-装饰器decorator


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)