亲宝软件园·资讯

展开

Python装饰器

渴望力量的哈士奇 人气:0

通过学习装饰器可以让我们更好更灵活的使用函数,通过学会使用装饰器还可以让我们的代码更加优雅。

在我们的实际工作中,很多场景都会用到装饰器,比如记录一些日志、或者屏蔽一些不太合法的程序执行从而使我们的代码更加安全。

装饰器

什么是装饰器?虽然对这个次感到陌生,但是完全不需要担心。

首先,装饰器也是一种函数;只不过装饰器可以接收 函数 作为参数来传递。

并且可以通过 return 可以返回一个函数,装饰器通过接收一个函数,对它在装饰器内部进行处理、调用,并返回一个新的函数,同时还可以动态增强传入函数的功能。

装饰器整个流程是这样的:

接下来我们看看 装饰器长什么样子

def a():
    
    def b():
        print(helloworld)
        
    b()
    
    
a()
b()

a() 函数中书写了一个 b() 函数,并在 a() 函数中调用 b() 函数。是不是非常类似在类中定义一个局部函数并调用的例子?其实装饰器就是有些类似这样的操作,只不过被装饰器调用的函数是通过 参数 的形式传进去,并在 b() 函数中执行。

我们在定义完 a() 函数之后进行调用,可以正常处理。但是 b() 函数 是 a() 函数的局部函数 如果在外部调用会报错。(如上文中的第十行,就会报错)

装饰器的定义

示例如下:

def out(func_args):            # 装饰器的第一层函数被称为 外围函数 , 'func_args' 为要处理的函数
    
    def inter(*args, **kwargs):        # 外围函数 的函数体内定义的函数被称为 内嵌函数 ;传入的参数为要处理的 func_args 函数的参数
                                    # 这里我们并不知道 func_args 函数需要传入进来的参数是什么,所以目前写传入可变参数是比较合理的
        return func_args(*args, **kwargs)        # 在 内嵌函数 的函数体内调用 func_args 函数,并将可变参数传入
                                                # 其实这里我们可以处理更多的逻辑;
                                                # 我们可以选择执行或者不执行,甚至可以func_args 函数的执行结果进行二次处理
    
    
    return inter             # 书写完 内嵌函数的业务之后,我们在 外围函数体内返回 内嵌函数
                            # 需要注意的是,这里是不执行的(因为没有加括号),这是装饰器的定义规则,是必不可少的
                            # 只有外围函数返回内嵌函数,才可以被之后的代码执行;(因为所有的业务都在内嵌函数中,不返回就无法执行调用)

装饰器的用法

在我们日常工作中,装饰器的使用方法有两种。

第一种:将被调用的函数直接作用为参数传入装饰器的外围函数括弧内;示例如下:

def a(func):
    
    def b(*args, **kwargs):
        return func(*args, **kwargs)
    
    return b


def c(name):
    print(name)
    

a(c)('Neo')

# >>> 执行结果如下:
# >>> Neo

第二种:将装饰器与被调用函数绑定在一起, @ 符号 + 装饰器函数放在被调用函数的上一行,被调用的函数正常定义,只需要直接调用被执行函数即可。示例如下:

def a(func):
    
    def b(*args, **kwargs):
        return func(*args, **kwargs)
    
    return b


@a
def c(name):
    print(name)
    
    
c('Neo')

# >>> 执行结果如下:
# >>> Neo

最常用的装饰器用法为第二种。

现在我们构建一个 检查字符串类型的装饰器,加深一下对装饰器的理解。

def check_ok(func):

    def inner(*args, **kwargs):
        result = func(*args, **kwargs)
        if result == 'OK':
            return '传入的参数数据为:\'%s\'' % result
        else:
            return '传入的参数数据不为:\'OK\''

    return inner


@check_ok
def test_str(data):
    return data


result = test_str('OK')
print(result)

# >>> 执行结果如下:
# >>> 传入的参数数据为:'OK'

result = test_str('NO')
print(result)

# >>> 执行结果如下:
# >>> 传入的参数数据不为:'OK'

加载全部内容

相关教程
猜你喜欢
用户评论