装饰器的基本讲解

文中内容是我近期学习python所留下来的笔记,上传平台是为了保存防止误删造成笔记丢失,跪求浏览笔记的朋友给个赞

import time
def f1():
    print('this is a function')
#f1()只能打印一个语句,当我们想要加入打印时间这一功能并不改变f1()函数内部的实现,这时装饰器就可以做到
def decorator(func):
    def wrapper():
            func()
            print(time.time())
    return wrapper
r=decorator(f1)
r()
#当然函数式编程也能做到

def f2(func):#将f1()当成一个参数传入
    print(time.time())
    func()
f2(f1)
#当然装饰器还有更方便的方法使之继续调用f1()的情况下也能增加功能:在函数的定义前加上@装饰器然后直接调用该函数并增加功能
#例如:
def decor(func):
    def wrap():
        print(time.time())
        func()
    return wrap
@decor
def f3():
    print('hello world')
f3()
#以上的装饰器都是没有参数的形式,当有参数传入的时候怎么办
#例如要往f4()后面加上一句话‘你好,世界’
def dec1(func):
    def wap1(addition):
        print(time.time())
        func(addition)
    return wap1
@dec1
def f4(addition):
    print('hello world'+addition)
f4('你好,世界')
#若要传递多个函数则添加在装饰器函数中的参数名改成可变参数:*+参数名;;;用于解决函数列表不知一个参数
def dec2(func):
    def wap(*addition):
        print(time.time())
        func(*addition)
    return wap
@dec2
def f5(addition1,addition2,addition3):
    print('hello world'+addition1+addition2+addition3)
f5('你好,世界','我热爱生活','我想获得成功和幸福')
#若传入的参数为关键字参数呢?我们尝试可知关键字参数不能用可变参数来表示
#所以我们应该在装饰器里加上关键字函数
#例如
def dec3(func):
    def wap2(*addition,**kw):
        print(time.time())
        func(*addition,**kw)
    return wap2
@dec3
def f6(addition1,addition2,**kw):
    print('hello world'+addition1+addition2)
    print(kw)
f6('你好,世界','我热爱生活',a=1,b=2,c=3)#这里会以字典的形式将关键字参数打印出
发布了10 篇原创文章 · 获赞 8 · 访问量 235

猜你喜欢

转载自blog.csdn.net/weixin_46325250/article/details/105398550