函数装饰器-Python

嵌套函数:在函数中定义函数

def A(k = "enter" ):
    print("This is A function")
    def B():
        return "This is B function" 
    def C():
        return "This is C function" 
    print(B())
    print(C()) 
A()
>>> This is A function
>>> This is B function
>>> This is C function

函数返回函数:不需要在一个函数里去执行另一个函数,可以将其作为输出返回出来

def A(k = "enter" ):
    def B():
        return "This is B function" 
    def C():
        return "This is C function" 
    if k == "enter":
    	return B
    else:
    	return C
ans = A()
print(ans)
>>> <function A.<locals>.B at 0x000002591645C9D8>
#上面清晰地展示了ans现在指向到A()函数中的B()函数

print(ans())
>>> This is B function

在 if/else 语句中我们返回 B 和 C,而不是 B() 和 C()。这是因为当把一对小括号放在后面,这个函数就会执行;然而如果不放括号在它后面,那它可以被到处传递,并且可以赋值给别的变量而不去执行它。
当写下 ans = A(), A()会被执行,而由于K 参数默认是 enter,所以函数 B 被返回了。如果把语句改为ans = A(“come in”),那么C函数将被返回。还可以打印出 A()(),这时会输出 This is B function。

def A(k = "enter" ):
    def B():
        return "This is B function" 
    def C():
        return "This is C function" 
    if k == "enter":
    	return B
    else:
    	return C
ans = A("come in")
print(ans)
print(A()())
>>> <function A.<locals>.C at 0x000001BF70322268>
>>> This is B function

函数作为参数传给另一个函数

def A(k = "enter" ):
	return "This is A function" 
def B(func):
    print("This is B function" )
    print(func())
B(A)
>>> This is B function
>>> This is A function

到这里其实已经创建了一个装饰器,装饰器本质上是一个Python函数,它可以让其它函数在不作任何变动的情况下增加额外功能,装饰器的返回值也是一个函数对象。

def A(func):
	def B():
		print("B function start executing a func()" )
		func()
		print("B function finish executing a func()" )
	return B 

def C():
	print("C function")
	
C()
>>> C function

C = A(C)
C()
>>> B function start executing a func()
>>> C function
>>> B function finish executing a func()

@A 只是一个简短的方式去说明C = A (C)

def A(func):
    def B():
        print("B function start executing a func()" )
        func()
        print("B function finish executing a func()" )
    return B 
@A
def C():
	print("C function")
C()
>>> B function start executing a func()
>>> C function
>>> B function finish executing a func()

装饰器蓝本规范:
有了装饰器我们就可以抽离出大量的与函数功能无关的雷同代码进行重用。

def decorator_name(func):
    def decorated(*args, **kwargs):
        if not can_run:
            return "Function will not run"
        return func(*args, **kwargs)
    return decorated
@decorator_name
def a_func():
    return("Function is running")
 
can_run = True
print(a_func())
>>> Function is running

can_run = False
print(a_func())
>>> Function will not run

装饰器使用场景

授权

def requires_auth(func):
    def decorated(*args, **kwargs):
        auth = request.authorization
        if not auth or not check_auth(auth.username, auth.password):
            authenticate()
        return func(*args, **kwargs)
    return decorated

日志

def logit(func):
    def with_logging(*args, **kwargs):
        print(func.__name__ + " was called")
        return func(*args, **kwargs)
    return with_logging
 
@logit
def addition_func(x):
   return x + x

result = addition_func(4)
>>> addition_func was called
print(result)
>>> 8
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值