Python Decorator Closure

简介:

最近在看FP相关, 看到Closure, 想起这个... python的装饰器方法是用闭包实现的

Closure是什么就不解释了, 可以看上面第一个blog

 

装饰器, 经典的设计模式, 动态地给一个对象添加一些额外的职责.

大家在写代码的时候, 除了核心的逻辑, 往往还有许多辅助的逻辑, 比如, log, try catch, lock, time计时, 等等...

如果都混在一起, 严重影响代码的整洁度, 比如log或try catch这种需要随处加的, 非常影响开发效率, 和可读性

而装饰器最大的应用, 就是将核心代码和辅助代码分离.

 

以time为例,大家在测performance的时候会在自己代码里面加上大量的这样的代码, 非常烦...

import time
def foo():
    start = time.clock()
    print 'in foo()'
    end = time.clock()
    print 'used:', end - start
 

Python这种动态语言, function也是first-class, 所以简单改进如下, 虽然简单, 但是这已经属于装饰器设计模式
这种改动的问题在于, 你想想这种performance代码都是临时加上的, 如果每次都需要修改函数名来测时间, 相当麻烦

import time
 
def foo():
    print 'in foo()'
 
def timeit(func):
    start = time.clock()
    func()
    end =time.clock()
    print 'used:', end - start
 
 
 
import time
 
def foo():
    print 'in foo()'
 
def timeit(func):
     def wrapper():
        start = time.clock()
        func()
        end =time.clock()
        print 'used:', end - start
    return wrapper
 
foo = timeit(foo)
foo()

 

装饰器方法的Python语法糖,@

@timeit,在定义上加上这一行与另外写foo = timeit(foo)完全等价

import time
 
def timeit(func):
    def wrapper():
        start = time.clock()
        func()
        end =time.clock()
        print 'used:', end - start
    return wrapper
 
@timeit
def foo():
    print 'in foo()'

python中内嵌的装饰器方法, 分别是staticmethod、classmethod和property
 
 
再给出一个lock的例子, 对于线程lock需要传入同一个lock对象, 更加体现出闭包
博主嫌这个方法不够优雅, 写了套更简单的
把lock对象的生成封装到一个Decorate类中, 并在类初始化是完成对于所有类函数自动的wrapper, 这个取决于python的动态特性, 可以run-time时获取, 修改函数的逻辑.
具体可以参考第一个blog
def sync(func):
    def   wrapper(*args, **kv):
          self = args[0]
          self.lock.acquire()
          try:
               return func(*args, **kv)
          finally:
               self.lock.release()
    return wrapper

class Foo(object):
       def __init__(self, …):
              self.lock = threading.Lock()
       @sync
       def  interface1(self, …):
              do something

       @sync
       def  interface2(self, …):
              do something

本文章摘自博客园,原文发布日期:2013-02-08
目录
相关文章
|
5月前
|
Python
Python Decorator基础课程分享
Python Decorator基础课程分享
19 0
|
6月前
|
缓存 测试技术 数据库
【Python 基础】什么是装饰器(decorator)?
【5月更文挑战第6天】【Python 基础】什么是装饰器(decorator)?
|
6月前
|
测试技术 Python
解释Python中的装饰器链(Decorator Chaining)。
解释Python中的装饰器链(Decorator Chaining)。
42 6
|
6月前
|
缓存 测试技术 Python
Python小知识 - 1. Python装饰器(decorator)
Python小知识 - 1. Python装饰器(decorator)
|
Python
Python:decorator装饰器的使用示例
Python:decorator装饰器的使用示例
120 0
|
Python
Python编程:decorator装饰器
Python编程:decorator装饰器
118 0
|
Python
Python:decorator装饰器的使用示例
Python:decorator装饰器的使用示例
119 0
|
Python
Python知识点:理解和使用装饰器 @decorator
Python的装饰器(decorator)是一个很棒的机制,也是熟练运用Python的必杀技之一。装饰器,顾名思义,就是用来装饰的,它装饰的是一个函数,保持被装饰函数的原有功能,再装饰上(添油加醋)一些其它功能,并返回带有新增功能的函数对象,所以装饰器本质上是一个返回函数对象的函数(确切的说,装饰器应该是可调用对象,除了函数,类也可以作为装饰器)。
1517 0
|
缓存 Python 自然语言处理
Python Decorator 和函数式编程
来源:https://www.oschina.net/translate/decorators-and-functional-python Python Decorator 和函数式编程 英文原文:Decorators and Functional Python Decorators 是Python中最重要的特性之一. 它除了使Python更好用外的, 它还能帮助我们以一
1421 0
下一篇
无影云桌面