python装饰器使用多吗_Python——装饰器(两种不同的使用场景)

#例子,通过装饰器给show_name()函数增加验证功能

#version 1 #普通函数不带参数,装饰器带参数

def auth(func):

# print(func.__name__) #通过打印这个结果得知,show_name函数被传入进来了

def auth_decorator(user, pwd):

u = "toby"

p = "1qaz#EDC"

if user == u:

if pwd == p:

print("auth done...")

func() #所以形式参数func等价于show_name()

else:

print("password error")

else:

print("not found user")

return auth_decorator

@auth

def show_name():

print("my name is toby")

show_name("toby","1qaz#EDC")

# #########################################################################################

#version 2 普通函数和装饰器都带参数

def auth(func):

# print(func.__name__) #通过打印这个结果得知,show_name函数被传入进来了

def auth_decorator(name, user, pwd):

u = "toby"

p = "1qaz#EDC"

if user == u:

if pwd == p:

print("auth done...")

func(name) #所以形式参数func等价于show_name()

else:

print("password error")

else:

print("not found user")

return auth_decorator

@auth

def show_name(name):

print("my name is {0}".format(name))

show_name("ttr", "toby","1qaz#EDC")

#此时就要把show_name函数看成是show_name(name, user, pwd)这样,传三个参数进去

# #########################################################################################

#version 3 下面的使用的语法,允许动态的创建装饰过的函数对象

def auth(func):

# print(func.__name__) #通过打印这个结果得知,show_name函数被传入进来了

def auth_decorator(user, pwd):

u = "toby"

p = "1qaz#EDC"

if user == u:

if pwd == p:

print("auth done...")

func() #所以形式参数func等价于show_name()

else:

print("password error")

else:

print("not found user")

return auth_decorator

def show_name():

print("my name is juck")

#在这个函数中用auth_enable参数来控制是否装饰show_name函数

#auth_enable参数为True,则必须提供user和pwd

#也就是说是开启验证和关闭验证由auth_enable来决定

def show_name_strengthen(auth_enable=False, u=None, p=None ):

if auth_enable:

s = auth(show_name)

s(u, p)

else:

show_name()

#show_name_strengthen()

show_name_strengthen(True, "toby", "1qaz#EDC")

'''

两种不同的语法,使用场景:

1、语法用@符号来使用装饰器,这种语法往往用于对不同的函数做永久性的更改

2、这种语法允许我们动态的创建装饰过的函数对象,比如有多个不同功能的装饰器,

引入判断条件来使用不同的装饰器,也就是说可支持多种可选行为

'''

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值