zoukankan      html  css  js  c++  java
  • 装饰器

    我们用一个最简单的代码解释一下装饰器的概念,其实装饰器就是一个函数,以另一个函数作为参数,这样就给这个参数函数添加了额外的功能。我们看看下面这段代码:

    def deco(func):
        print('before func')
        func()
        print('after func')
        return func
    
    def func():
        print('func running')
    
    deco(func)

    运行结果为:

    >>> 
    before func
    func running
    after func

    不过,通常为了简写代码,都是使用@符号,下面这段代码和上面是一样的。

    def deco(func):
        print('before func')
        func()
        print('after func')
        return func
    
    @deco
    def func():
        print('func running')

    可以看一下这段代码的输出结果:

    >>> 
    before func
    func running
    after func

    更通用的写法是使用内嵌函数,然后在返回这个内嵌函数,这样做可以的好处后面你会感受到

    def deco(func):
        def _deco():
            print('before func')
            func()
            print('after func')
        return _deco
    
    @deco
    def func():
        print('func running')
    
    func()

    它的运行结果是:

    >>> 
    before func
    func running
    after func

    假如参数函数是带参数的,看下面的代码,这时候你就看到内嵌函数装饰器的好处了。可以对参数进行处理

    def deco(func):
        def _deco(x,y):
            print('before func')
            func(x,y)
            print('after func')
        return _deco
    
    @deco
    def func(a,b):
        print(str(a) + '' + str(b))
    
    func(1,2)

    运行结果是这样的:

    >>> 
    before func
    1和2
    after func

    现在我们要处理更加复杂的问题,我们要装饰的函数不仅仅有两个参数的,还有三个参数的,我们使用星号。一个星号表示列表型参数,两个星号表示字典型参数

    def deco(func):
        def _deco(*x,**y):
            print('before func')
            func(*x,**y)
            print('after func')
        return _deco
    
    @deco
    def func(a,b):
        print(str(a) + '' + str(b))
    
    @deco
    def func2(a,b,c):
        print (str(a) + '' + str(b) + '' + str(c))
    
    func(1,2)
    func2(1,2,3)

    输出结果是这样的:

    >>> 
    before func
    1和2
    after func
    before func
    1和2和3
    after func
  • 相关阅读:
    Educational Codeforces Round 67 D. Subarray Sorting
    2019 Multi-University Training Contest 5
    Educational Codeforces Round 69 (Rated for Div. 2) E. Culture Code
    Educational Codeforces Round 69 D. Yet Another Subarray Problem
    2019牛客暑期多校训练第六场
    Educational Codeforces Round 68 E. Count The Rectangles
    2019牛客多校第五场题解
    2019 Multi-University Training Contest 3
    2019 Multi-University Training Contest 2
    [模板] 三维偏序
  • 原文地址:https://www.cnblogs.com/singeldiego/p/4819325.html
Copyright © 2011-2022 走看看