python---装饰器工作原理解析从浅入深

装饰器:在不改变被装饰对象‘内部代码’以及‘调用方式’的基础上添加新的功能

原则:开放封闭原则,对扩展开放,对修改封闭。

**装饰器重在函数相关知识对整合

装饰器简单了解使用

import time
def bigg():
    time.sleep(3)#8
    print('我是大哥')  #9 3秒之后打印
def small():
    time.sleep(1)
    print('我是小弟')
def outer(func):
    def all(): # 2
        start_time = time.time()  #6
        func()#7  #10   func==bigg//func==small  func变量名
        end_time = time.time()  #11
        print('函数运行的时间%s' % (end_time - start_time))   #12
    return all  #3
bigg = outer(bigg) #4bigg
bigg()   #5  #13
small=outer(small)
small()

总结:赋值一个变量名用来灵活绑定各个需要调用的变量名(变量)。

装饰器进阶

解决参数问题以及返回值

添加形参*args和**kwargs,接住即将填入返回的实参。

import time
def index():
    time.sleep(3)
    print('亚洲最大的线上赌场开业了 裸体美女在线发牌!!!')
def people(name):
    time.sleep(1)
    print('%s正在发牌' % name)
def outer(func):
    def get_time(*args, **kwargs):
        start_time = time.time()
        func(*args, **kwargs)
        end_time = time.time()
        print('每张牌发布时间:%s' % (end_time - start_time))
    return get_time
index = outer(index)
index()
people = outer(people)
people('Evelyn')

 案例:用户认证装饰器

代码演示:

 

#用户认证装饰器,校验用户名和密码
#记录用户的状态
#3个状态3个def
import time
def cash():
    time.sleep(1)
    print('你的余额还有999999元啊')
def shop():
    time.sleep(2)
    print('你今年双十一贡献了250000元整')
def box():
    time.sleep(3)
    print('你的衣柜已经装不下了!不要在买啦!!')
#定义一个用于记录用户是否登陆的数据
is_login={'is_login':False}
print(type(is_login))
#共同代码的部分,用户登陆以及登陆状态的判定
def index(func):
    def auth(*args,**kwargs):#2
        # 2.判断用户是否已经登陆,如果没有这句判定,每个指令用户都会在登陆一遍
        if is_login.get('is_login'):
            res = func(*args, **kwargs)
            return res
        #1.先获取用户的用户名和密码
        username=input('登陆你的用户名:').strip()
        pwd=input('登陆你的密码:').strip()

        #校验用户名和密码是否正确
        if username=='Bella' and pwd=='123':
            #正确执行函数
            res=func(*args,**kwargs)
            # 登陆成功修改用户的登陆状态
            is_login['is_login']=True
            return res
        else:
            print('用户名或密码错误,请填写正确的指令')

    return auth#3
cash=index(cash)#4
cash()#5
shop=index(shop)
shop()
box=index(box)
box()

装饰器固定模版

def outer(func):
    def inner(*args,**kwargs):
        print('执行函数之前可以添加的额外功能')
        res=func(*args,**kwargs)#执行被装饰的函数
        print(''执行函数之后可以添加的额外功能)
        return res#将被装饰函数执行之后的返回值返回
    return inner

语法糖
装饰器语法糖是写规范
    语法糖必须紧贴在被装饰对象的上方
装饰器语法糖内部原理
    会自动将下面紧贴着的被装饰对象名字当做参数传给装饰器函数调用

@outer==index = outer(index)

装饰器修复技术

from functools import wraps
def outer(func):
    @wraps(func)  # 修复技术就是为了让被装饰对象更加不容易被察觉装饰了
    def inner(*args, **kwargs):
        print('执行函数之前可以添加的额外功能')
        res = func(*args, **kwargs)  # 执行被装饰的函数
        print('执行函数之后可以添加的额外功能')
        return res  # 将被装饰函数执行之后的返回值返回
    return inner


@outer  # index = outer(index)
def index():
    print('from index')
print(index)
help(index)

def home():
    """这是一个home函数"""
    print('from home')
# help(index)
# help(home)
# print(index)
# help(len)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值