Python3.x基础学习-装饰器

装饰器

1.装饰器函数的本质:一个闭包函数
2.装饰器函数的作用:在不修改原函数及其调用方式的情况下对原函功能进行扩展
3.语法格式: @装饰器名称

def foo():
    print('foo')
foo()
# 公司有N个部门,每个部门负责相应的业务

def f1():
    print("身份验证")
    print("f1")

def f2():
    print("身份验证")
    print("f2")

def f3():
    print("身份验证")
    print("f3")
def f4():
    print("身份验证")
    print("f4")

f4()

# 身份验证
# f4
#更改
#
def check():
    print('身份验证')

def f1():
    check()
    print("f1")

def f2():
    check()
    print("f2")

def f3():
    check()
    print("f3")
def f4():
    check()
    print("f4")

f3()

# 身份验证
# f3
# 开放封闭原则
# 封闭:对已经实现的功能代码块,不能轻易修改
# 开发:可以对外扩展功能

def check(f):
    def inner():
        print("身份验证")
        f()
    return inner

@check

def f1():
    print("f1")

@check

def f2():
    print("f2")

# f1()
f2()
def outter(f):
    def inner():
        print("---这是内嵌函数---")
        f()
        print('---在这里执行完了--')
    print("---外层函数---")
    return inner

@outter

def func():
    print("----就看看你想干哈----")

func()
print(func.__name__)

# ---外层函数---
# ---这是内嵌函数---
# ----就看看你想干哈----
# ---在这里执行完了--
# inner
import time
def outter(f):
    def inner():
        x1 = time.time()
        f()
        x2 =time.time()
        x = x2-x1
        print("程序运行了{}秒".format(x2-x1))
    return inner

@outter

def func():
    time.sleep(2)
    print('我就想它执行一秒怎么滴')

func()

# 我就想它执行一秒怎么滴
# 程序运行了2.0008254051208496秒
import time
def outter(f):
    def inner():
        x1 = time.strftime("%Y-%m-%D %X",time.localtime())
        print(x1)
        f()
        x2 = time.strftime("%Y-%m-%D %X", time.localtime())
        print(x2)
    return inner

@outter

def func():
    time.sleep(2)
    print('我就想它执行一秒怎么滴')

func()
#
#2020-04-04/16/20 00:19:08
# 我就想它执行一秒怎么滴
# 2020-04-04/16/20 00:19:10
# 多个装饰器原理

#执行原理:先执行距离函数近的装饰器

def outter1(f):
    def inner1():
        print('-----before inner1-----')
        f()
        print('--------After inner1----------')
    return inner1

def outter2(f):
    def inner2():
        print('-----before inner2-----')
        f()
        print('--------After inner2----------')
    return inner2

@outter1
@outter2

def func():
    print("看看什么是多个装饰器,学习学习")

func()
#
# -----before inner1-----
# -----before inner2-----
# 看看什么是多个装饰器,学习学习
# --------After inner2----------
# --------After inner1----------
# 带参数的装饰器

def outter(f):
    def inner(*args,**kwargs):
        print(args)
        print(kwargs)
        f()
    return inner

@outter

def func():
    print("什么鬼,还有参数")

func(10,20,name ='johnson')

# (10, 20)
# {'name': 'johnson'}
# 什么鬼,还有参数
def outter(f):
    def inner(a,b):
        f(a,b)
    return inner

@outter   #func = outter(func)

def func(a,b):
    print(a+b)
    print("什么鬼,还有参数")

func(10,20)
print(func.__name__)

# 30
# 什么鬼,还有参数
# inner
def outter(f):
    def inner():
        ret = f()
        return ret
    return inner

@outter

def func():
    print("卧槽,还有返回值")
    return "卧槽,无情"

func()
print(func())     #执行inner,inner需要有返回值才能打印,否则就是None

# 卧槽,还有返回值
# 卧槽,还有返回值
# 卧槽,无情
# 使用@wraps(func)解决被装饰函数的信息不能查看问题

from functools import wraps

def outter(f):
    @wraps(f)
    def inner(*args,**kwargs):
        f()
    return inner

@outter
def func():
    print("卧槽,还能用wraps")

func(10,20,name='johnson')

print(func.__name__)

# 卧槽,还能用wraps
# func

猜你喜欢

转载自www.cnblogs.com/johnsonbug/p/12709776.html