python中的装饰器

python中的装饰器

python中的装饰器decorator很像java中的环绕代理(AOP)。装饰器可以增强被装饰(代理)的方法,具体而言,它可以控制被代理函数知否被执行,还可以在执行被代理函数之前执行一些逻辑,也可以执行被代理函数之后执行一些逻辑。

装饰器定义格式

不传入额外参数的装饰器

def 装饰器名称(x(该参数用于接收被代理函数。参数与参数名无关)):
    def 代理函数名称(*args,**kwargs):
    # args是一个元组,里面为被代理函数所需的所有参数。
   
        # 这里写被代理函数执行前的逻辑
        result=x(*args,**kwargs)
        # 这里写被代理函数执行后的逻辑
        return result# 这里要返回被代理函数的结果(固定写法)
	
    def 装饰器其他函数(该函数参数):
    	return
    
    def 装饰器其他函数(该函数参数):
    	return
    
    return 代理函数名称# (固定写法)这里返回哪个函数,哪个函数就作为代理函数

@装饰器名称
def 被代理的函数(该函数参数):
    # 该函数逻辑
    
# 使用装饰器
被代理的函数(该函数参数)# 这里虽然调用的是被代理的函数,但执行的是 代理函数    

带参数的装饰器

def 装饰器名称(x):
    def 其他函数(参数表):
        return
    
    def 其他函数(参数表):
        return

    def dec(func):
        def wrapper(*args, **kwargs):
            for _ in range(num_times):
                result = func(*args, **kwargs)
            return result
        
        def 其他函数():
            return
        
        return wrapper# 返回的是wrapper,所以执行的是wrapper

    return dec  # 返回的是函数dec,所以dec为代理函数。


@装饰器名称(x)
def 被代理函数(参数表):

经典示例

不带参数

def decorator(func):  
    def wrapper(*args, **kwargs):  
        # 在这里添加额外的功能  
        print("我在func之前执行")  
        result = func(*args, **kwargs)  
        print("我在func之后执行")  
        return result#我返回func的返回值
    return wrapper#我返回代理函数本身(这是固定写法)  
  
@decorator  
def my_function():  
    print("Hello, this is my function.")  
  
# 调用my_function时,实际上调用的是wrapper函数  
my_function()

# 输出:
# 我在func之前执行
# Hello, this is my function.
# 我在func之后执行

使用被代理函数参数

def decorator(func):  
    def wrapper(*args, **kwargs):  
        print("args为:",args)
        print("kwargs为:",kwards)
        result = func(*args, **kwargs)  
        return result  
    return wrapper  
  
@decorator  
def my_function(x, y):  
    return x + y  
  
print(my_function(3, 4))

# args为: (3, 4)
# kwargs为: {}
# 7

带参数的装饰器

def repeat(num_times):
    def other(func,*args,**kwargs):
        for _ in range(num_times):
            func(*args,**kwargs)

    def dec(func):
        def wrapper(*args, **kwargs):
            other(func,*args)
            result = None
            for _ in range(num_times):
                result = func(*args, **kwargs)
            return result
        
        def dec_other():
            print("我是dec的其他函数")
        
        return wrapper# 返回的是wrapper,所以执行的是wrapper

    return dec  # 返回的是函数dec,所以dec为代理函数。


@repeat(3)
def say_hello():
    print("你好")


say_hello()  # 输出六次你好!

不执行被代理函数

def decorator(func):
    def wrapper(*args, **kwargs):
        # 在这里添加额外的功能
        print("我在func之前执行")
        result = None
        print("我在func之后执行")
        return result
    return wrapper  # 我返回代理函数本身(这是固定写法)


@decorator
def my_function():
    print("Hello, this is my function.")


# 调用my_function时,实际上调用的是wrapper函数
my_function()

# 输出:
# 我在func之前执行
# 我在func之后执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值