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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 3,776评论 0 7
  • 要点: 函数式编程:注意不是“函数编程”,多了一个“式” 模块:如何使用模块 面向对象编程:面向对象的概念、属性、...
    victorsungo阅读 1,568评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,969评论 19 139
  • 大雨磅礴,路上行人稀稀落落 我站窗边看你慢慢走过 是第几次已经记不得 你说爱雨不必躲 你说撑伞是个错 避雨的人从不...
    谬谬Ares阅读 332评论 0 3
  • 部分答案参考了网络上的回答,具体可以参考书籍:《Java并发编程实战》《深入理解Java虚拟机》及JDK源码 多线...
    叫我西门阅读 644评论 0 2