Python装饰器

装饰器本质上就是一个闭包函数,装饰器有且只有一个参数,参数为要装饰的函数
作用:不改变原函数,而增强其功能

def decorator(fn):
    def inner():
        print('已登录')
        fn()
    return inner

@decorator
def work():
    print('可以进行游戏')

work()
# 不改变work函数统计work函数执行的时间
from time import *

def function(fn):
    def inner():
        begin = time()
        fn()
        over = time()
        print('时间:',over - begin)
    return inner

@function # 装饰器
def work():
    for i in range(1000):
        print(i)

work()
# 通用装饰器
# 可以理解为你装饰的函数什么结构内部函数就要什么结构

def function(fn):
    def inner(*args,**kwargs):
        print('正在执行加法运算')
        return fn(*args,**kwargs)
    return inner


@function
def add(*args,**kwargs):
    result = 0
    for i in args:
        result += i
    for value in kwargs.values():
        result += value
    return result

result = add(name=1,age=3)
print(result)
result1 = add(1,3,4)
print(result1)
result2 = add(5,age=18)
print(result2)
# 多个装饰器使用,装饰过程由内到外
def make_div(fn):
    def inner():
        return '<div>' + fn() + '<div>'
    return inner

def make_p(fn):
    def inner():
        return '<p>' + fn() + '<p>'
    return inner

@make_div
@make_p
def content():
    return '人生苦短,我用python'

print(content())
# 装饰器同时装饰两个函数,通过包装返回装饰器达到效果

def return_function(flag):
    def function(fn):
        def inner(a,b):
            if flag == '+':
                print('正在执行加法运算')
                return fn(a,b)
            elif flag == '-':
                print('正在执行减法运算')
                return fn(a,b)
        return inner
    return function


@return_function('+')
def add(a,b):
    return a + b

@return_function('-')
def sub(a,b):
    return a - b

print(add(1,3))
print(sub(1,3))

posted @ 2021-03-09 19:17  code-G  阅读(83)  评论(0编辑  收藏  举报