首页 > 其他 > 详细

6装饰器

时间:2020-04-07 21:46:44      阅读:66      评论:0      收藏:0      [点我收藏+]

Python允许使用装饰器对函数进行装饰,装饰器可以帮助函数实现一些通过的功能,在函数调用前运行些预备代码或函数调用后执行清理工作。如:插入日志、检测性能(计时)、事务处理、缓存、权限校验等。这样编写函数时就可以专注于功能的实现,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。

定义:装饰器本质就是函数,功能是在不更改原函数的代码前提下给函数增加新的功能。包装后返回一个装饰后的函数对象,该函数对象将更新原函数对象,程序将不再能访问原始函数对象。

原则:1不修改被修饰函数的源代码     2不修改被修饰函数的调用方式,在两者的前提上扩展其功能

例子1:

# 计算时间

import time

def deco(func):
    def wrapper(*args, **kwargs):#接收任意参数
        start_time = time.time()
        res = func(*args, **kwargs)#这里有括号,运行了func函数
        end_time = time.time()
        spend_time = end_time - start_time
        print(运行时间:, spend_time)
        return res
    return wrapper

@deco  # foo=deco(foo)
def foo():
    time.sleep(1)
    print(hello cc)

foo()

 例子2:

# 验证授权
user_list = [{username:cc,password:123},{username:dd,password:111}]
def auth(func):
    def wrapper(*args, **kwargs):
        name = input(name>>>:)
        pwd = int(input(pwd>>>:))
        for i in user_list:
            if i[username] == name and i[password] == pwd:
                res = func(*args, **kwargs)
                return res
    return wrapper


@auth
def index():
    print(index....)
@auth
def shopping():
    print(shoppiing....)

index()
shopping()

 

例子3:带参装饰器

# form functools import wraps提供了装饰器@wrap来保留原函数的属性
from functools import wraps

user_list = [{username:cc,password:123},{username:dd,password:111}]

def deco(type=a):#type=‘a‘默认参数
    def auth(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            if type == a:
                print(这是参数aaaaaa)
            else:
                print(这是参数bbbbbb)
            name = input(name>>>:)
            pwd = int(input(pwd>>>:))
            for i in user_list:
                if i[username] == name and i[password] == pwd:
                    res = func(*args, **kwargs)
                    return res
        return wrapper
    return auth


@deco()  # @deco(type=‘a‘)=====>@auth,但是这时候带了参数type=‘a‘
def index():
    print(index....)


@deco(type=kkkk)
def shopping():
    ‘‘‘kkkkkkkkkkkkkkkkkk‘‘‘
    print(shoppiing....)

index()
shopping()
print(shopping.__doc__)#装饰器@wrap来保留原函数的属性

 

 例子4:叠加多个装饰器

# 装饰器的加载顺序是从内到外的,从靠近函数的装饰器开始从内往外加载。
# 加载顺序:outer函数的调用顺序:自下而上
# 执行顺序:wrapper的执行顺序,自下而下
def outer1(func):
    print(加载了Outer1..)
    def wrapper1(*args, **kwargs):
        print(执行了wrapper1...)
        res = func(*args, **kwargs)
        return res
    return wrapper1

def outer2(func):
    print(加载了Outer2..)
    def wrapper2(*args, **kwargs):
        print(执行了wrapper2...)
        res = func(*args, **kwargs)
        return res
    return wrapper2

def outer3(func):
    print(加载了Outer3..)
    def wrapper3(*args, **kwargs):
        print(执行了wrapper3...)
        res = func(*args, **kwargs)
        return res
    return wrapper3

@outer1
@outer2
@outer3
def index():
    print(from index.....)   #====>index = outer1(outer2(outer3(index)))

print(========)
index()


#结果:
# 加载了Outer3..
# 加载了Outer2..
# 加载了Outer1..
# ========
# 执行了wrapper1...
# 执行了wrapper2...
# 执行了wrapper3...
# from index.....

 

6装饰器

原文:https://www.cnblogs.com/cc-world/p/12655952.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!