python笔记(1) 装饰器

最近看了一点点scrapy代码,其实完全没看明白。这代码中常常会出现@符号标记的函数,其实这就是装饰器。装饰器能给函数提供额外的功能。

def f(x):
    return x*x

上面的函数是一个普通的小函数,但是要是我想在函数中打印x的参数值,看样子我得该一下f的代码。还有我要限定x只能是数值类型,那么我也得修改一下代码。针对各式各样附加的需求,显然改代码是不合适的,我不能每要一个功能就在核心模块进行修改。

def f1(func):
      def nf(x):
            print(x)
            return func(x)
      return nf
ff = f1(f)

上面的代码满足我们的要求,但是不够漂亮。可以试试装饰器,看下面的代码多简单。

@f1
def f(x):
    return x*x

如果要检查类型怎么办?

def type_check(func):
      def nf(x):
            if isinstance(x,int):
                return func(x)
            else:
                print('type error')
      return nf

上面的方法也能实现我们的需求,但是这有个问题,这个函数只能做一种类型检查就是int,那我要是检查别的类型怎么办,看样子装饰器需要带参数才行。

def type_check(target_type):
    def f(func):
        def nf(x):
            if isinstance(x,target_type):
                return func(x)
            else:
                print('type error')
        return nf
    return f

仔细关注上面的代码,这个可与上面的差别有点大?
这函数内f其实才是装饰器,也不知道我这么理解对不对,当一个装饰器带参数的时候,也就是意味着要运行一次返回一个函数,这个函数才是真正的装饰器。
上面的装饰器只对应函数只有一个参数的形式,要做到通用这里可以使用如下代码:

def logging(func):
    def wrapper(*args, **kwargs):
        print("%s is running" % func.__name__)
        return func(*args,**kwargs)
    return wrapper
    原文作者:无事扯淡
    原文地址: https://www.jianshu.com/p/f33aed0b27a7
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞