python笔记(1) 装饰器

作者: 无事扯淡 | 来源:发表于2017-02-18 02:15 被阅读0次

    最近看了一点点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
    

    相关文章

      网友评论

        本文标题:python笔记(1) 装饰器

        本文链接:https://www.haomeiwen.com/subject/vzlrwttx.html