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
  • 相关阅读:
    一个棒棒糖引发的。。。
    做完了一个程序
    C# 串口操作系列(2) 入门篇,为什么我的串口程序在关闭串口时候会死锁 ? .
    MSSQL操作类
    煤矿粉尘监控系统需求分析
    C# 串口操作系列(3) 协议篇,二进制协议数据解析 .
    wp7 手机归属地查询
    .NET设计模式系列文章
    C# 串口操作系列(1) 入门篇,一个标准的,简陋的串口例子。
    常用经典算法
  • 原文地址:https://www.cnblogs.com/singeldiego/p/4819325.html
Copyright © 2011-2022 走看看