装饰器详解

1. 装饰器模板

def auth(func):
    def inner(*args, **kwargs):
        res = func(*args, **kwargs)
        return res
    return inner

1.1 装饰器的本质

本质实际上就是一种语法糖
例:auth=auth(index)

@app.route('/index', methods=['GET'])
@auth
def index():
    return render_template('index.html', users=USERS)

2. flask中装饰器的位置和执行顺序

2.1 简易的登录认证装饰器

def auth(func):
    def inner(*args, **kwargs):
        if session.get('username'):
            res = func(*args, **kwargs)
            return res
        else:
            return redirect('/login')
    return inner

2.2 中装饰器的位置

必须放在app.router下

@app.route('/index', methods=['GET'])
@auth
def index():
    return render_template('index.html', users=USERS)

如果是在路由下添加了装饰器,在每个app的视图方式下参数一定要添加endpoint参数

@app.route('/index', methods=['GET'],endpoint='detial')
@auth
def index():
    return render_template('index.html', users=USERS)

3. 类装饰器

3.1 装饰类的装饰器

效果可能是修改类属性,修改类方法

修改类属性的装饰器
# 定义一个装饰器
def decorater(cls):             # 传入一个类即cls,此时的cls就是animal
    cls.num_of_animals = 10     # 设置一个类属性
    return cls                  # 返回这个被装饰过的类

# 本质 a = decorater(animal)
@decorater
class animal:
    pass
# 这就完成了对类的装饰啦

# 类实例化得到一个对象
A = animal()  
# 上面这行代码相当于在运行a = decorater(animal) 运行的结果
# 就是返回了一个被装饰过的新的cls,因此新的cls有了新的属性,就是animal拥有了num_of_animals这一属性
# 我们就能调用这个num_of_animals的属性啦

print(A.num_of_animals)

修改类方法的装饰器
# 定义一个装饰器
def decorater(func):         
    def wrapper(cls):
        cls.num_of_animals = 10                   
        cls.f1 = func    
        # func就是printd这个方法
    	# 这里将传入的func即printd作为类的f1函数
        return cls
    return wrapper

@decorater(printd)
class animal:
    pass

def printd(*args):
    print('this is a function')
    
A = animal()
A.f1()   
# 是可以调用的哦
# 运行结果:this is a function

3.2 类作为装饰器

类作为装饰器只要将类中定义一个__call__方法,这样在类作为装饰器装饰函数时,函数运行时就会运行__call__方法中的内容,这就完成类作为函数装饰器的作用啦。

# 放个对象
class Person:
    def __call__(self, func):
        def inner(*args, **kwargs):
            res = func(*args, **kwargs)
            return res
        return inner
p = Person()

# test=p(test) 
@p  
# p() 会触发__call__--->Person的 __call__(func)--->返回inner,以后test就是inner---》test(参数)--》执行的是inner
def test():
    print("test")
print(test)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值