python3基础---详解装饰器

1、装饰器原理

def w1(func):
    def inner():
        print('---正在验证权限----')
        func()
    return inner
def f1():
    print('-----f1-----')

def f2():
    print('----f2-----')

#innerfunc = w1(f1)
#innerfunc()

f1 = w1(f1)
f1()      

2、装饰器语法

def w1(func):
    def inner():
        print('---正在验证权限----')
        func()
    return inner

@w1 #在func代表的函数身上添加@
def f1():
    print('-----f1-----')

def f2():
    print('----f2-----')

f1()

3、装饰器执行的时间

装饰器在Python解释器执行的时候,就会进行自动装饰,并不是在在执行的时候才进行装饰

4、两个装饰器

def w1(func):
    print('---正在装饰 1----')
    def inner():
        print('---正在验证权限 1----')
        func()
    return inner

def w2(func):
    print('---正在装饰 2----')
    def inner():
        print('---正在验证权限 2----')
        func()
    return inner

@w1 #f1 = w1(f1)
@w2 #f1 = w2(f1)
def f1():
    print('-----f1-----')

#在调用f1之前,已经进行了装饰
f1()

说明:
如果不调用f1,直接编译,打印结果是:

---正在装饰 2----
---正在装饰 1----

如果调用f1,打印结果是

---正在装饰 2----
---正在装饰 1----
---正在验证权限 1----
---正在验证权限 2----
-----f1-----

理解:

@w1 #f1 = w1(f1)
@w2 #f1 = w2(f1)
def f1():

当解释器程序执行这个的时候,先碰到@w1所以判断下面是否是def函数,发现下面是@w2,所以继续执行,当碰到def f1()的时候,找到要装饰的目标函数,所以先用w2对目标进行装饰,然后用w1对目标函数进行装饰

5、装饰器对有参和无参的函数进行装饰

1、有参

def func(funNume):
    def func_in(aa,bb):
        funNume(aa,bb)
    return  func_in

@func
def f1(a,b):
    print("------ppppp-----")
    
f1(11,12)

2、对有返回值的函数进行装饰

def func(funNume):
    def func_in(aa,bb):
        return funNume(aa,bb)

    return  func_in

@func
def f1(a,b):
    print("------ppppp-----")
    return ‘haha’
    
f1(11,12)

6 、通用装饰器

def func(funNume):
    def func_in(*args,**kargs):
        return funNume(*args,**kargs)
    return  func_in

@func
def f1(a,b):
    print("------f1-----")
    return 'haha'

@func
def f2():
    print("----f2-----")

@func
def f3(a):
    print("----f3-----")
#说明:*args,**kargs是不定参数

7、带参数的装饰器

def func_arg(arg = 'hello'):
    def func(funNume):
        def func_in(*args,**kargs):
            return funNume(*args,**kargs)
        return  func_in
    return func

#1.先执行func_arg('world')函数,这个函数return的结果是func这个函数的引用
#2.@func
#3.使用@func对f1进行装饰
@func_arg('world')
def f1(a,b):
    print("------f1-----")
    return 'haha'
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.1==,is的使用 ·is是比较两个引用是否指向了同一个对象(引用比较)。 ·==是比较两个对象是否相等。 1...
    TENG书阅读 4,079评论 0 0
  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 9,261评论 0 7
  • 1.1装饰器 装饰器是程序开发中经常会用到的一个功能,用好了装饰器,开发效率如虎添翼,所以这也是Python面试中...
    PythonMaO阅读 3,418评论 1 5
  • 9月17日就是北马了,今天上午九点已经开始领物了,跑步群里即将跑北马的小伙伴们已经按捺不住激动的心情,连上班都有点...
    晓雪Eileen阅读 1,720评论 2 0
  • 今天来谈下我自己在洞见时容易走的误区。 首先,什么是洞见? 我的理解,洞见就是把我们自己当做一个新朋友,时时反思,...
    心眸阅读 4,227评论 0 0

友情链接更多精彩内容