聊聊Python装饰器-Python教程

资源魔 47 0

【相干学习保举:python教程】

装璜器

  1. 实质是一个承受参数为函数的函数。
  2. 作用:为一个曾经完成的办法增加额定的通用性能,比方日记记载、运转计时等。

举例

没有带参数的装璜器,不必@
# 没有带参数的装璜器def deco_test(func):
    def wrapper(*args, **kwargs):
        print("before function")
        f = func(*args, **kwargs)
        print("after function")
        return f    return wrapperdef do_something(a,b,c):
    print(a)
    time.sleep(1)
    print(b)
    time.sleep(1)
    print(c)
    return aif __name__ == '__main__':
    # 不必@
    f = deco_test(do_something)("1","2","3")

输入:

before function
1
2
3
after function

集体了解:

相称于正在 do_something 函数里面套了两个输入:before function 以及 after function

没有带参数的装璜器,用 @
# 没有带参数的装璜器def deco_test(func):
    def wrapper(*args, **kwargs):
        print("before function")
        f = func(*args, **kwargs)
        print("after function")
        return f    return wrapper

@deco_testdef do_something(a,b,c):
    print(a)
    time.sleep(1)
    print(b)
    time.sleep(1)
    print(c)
    return aif __name__ == '__main__':
    # 应用@
    f = do_something("1","2","3")

输入:

before function
1
2
3
after function

集体了解:

相称于执行 do_something 函数的时分,由于有 @ 的缘由,曾经晓得有一层装璜器 deco_test,以是没有需求再独自写 deco_test(do_something) 了。

带参数的装璜器
# 带参数的装璜器def logging(level):
    def wrapper(func):
        def inner_wrapper(*args, **kwargs):
            print("[{level}]: enter function {func}()".format(level=level, func=func.__name__))
            f = func(*args, **kwargs)
            print("after function: [{level}]: enter function {func}()".format(level=level, func=func.__name__))
            return f        return inner_wrapper    return wrapper

@logging(level="debug")def do_something(a,b,c):
    print(a)
    time.sleep(1)
    print(b)
    time.sleep(1)
    print(c)
    return aif __name__ == '__main__':
    # 应用@
    f = do_something("1","2","3")

输入:

[debug]: enter function do_something()
1
2
3
after function: [debug]: enter function do_something()

集体了解:

装璜器带了一个参数 level = "debug"

最外层的函数 logging() 承受参数并将它们作用正在外部的装璜器函数下面。内层的函数 wrapper() 承受一个函数作为参数,而后正在函数下面搁置一个装璜器。这里的要害点是装璜器是能够应用通报给 logging() 的参数的。

类装璜器
# 类装璜器class deco_cls(object):
    def __init__(self, func):
        self._func = func    def __call__(self, *args, **kwargs):
        print("class decorator before function")
        f = self._func(*args, **kwargs)
        print("class decorator after function")
        return f

@deco_clsdef do_something(a,b,c):
    print(a)
    time.sleep(1)
    print(b)
    time.sleep(1)
    print(c)
    return aif __name__ == '__main__':
    # 应用@
    f = do_something("1","2","3")

输入:

class decorator before function
1
2
3
class decorator after function

集体了解:

应用一个装璜器去包装函数,前往一个可挪用的实例。 因而界说了一个类装璜器。

两层装璜器
# 没有带参数的装璜器def deco_test(func):
    def wrapper(*args, **kwargs):
        print("before function")
        f = func(*args, **kwargs)
        print("after function")
        return f    return wrapper# 带参数的装璜器def logging(level):
    def wrapper(func):
        def inner_wrapper(*args, **kwargs):
            print("[{level}]: enter function {func}()".format(level=level, func=func.__name__))
            f = func(*args, **kwargs)
            print("after function: [{level}]: enter function {func}()".format(level=level, func=func.__name__))
            return f        return inner_wrapper    return wrapper

@logging(level="debug")@deco_testdef do_something(a,b,c):
    print(a)
    time.sleep(1)
    print(b)
    time.sleep(1)
    print(c)
    return aif __name__ == '__main__':
    # 应用@
    f = do_something("1","2","3")

输入:

[debug]: enter function wrapper()
before function
1
2
3
after function
after function: [debug]: enter function wrapper()

集体了解:

正在函数 do_something() 里面先套一层 deco_test() 装璜器,再正在最里面套一层 logging() 装璜器。

想理解更多编程学习,敬请存眷php培训栏目!

以上就是聊聊Python装璜器的具体内容,更多请存眷资源魔其它相干文章!

标签: Python python教程 python编程 python使用问题 装饰器

抱歉,评论功能暂时关闭!