python 装饰器与AOP

无高见

1.缓存

from functools import wraps

lineseq = '==' * 20

def memo( func ):

    cache = {}

    @wraps( func )
    def wrapper( *args ):
        result = cache.get( args )
        if result is None:
            result = func( *args )
            cache[args] = result
        return result

    return wrapper

@memo
def fib( n ):
    if n < 2:
        return n
    return fib( n - 1 ) + fib( n - 2 )

print fib( 10 )

2.注册函数信息

import time

def logger( func ):

    @wraps( func )

    def deco( *args, **kwargs ):
        start_time = time.time()
        result = func( *args, **kwargs )
        end_time = time.time()
        print 'function = {0}'.format( func.__name__ )
        print 'arguments = {0}{1}'.format( args, kwargs )
        print 'return = {0}'.format( result )
        print 'time = %.6f sec'%( start_time - end_time )
        return result
    return deco

@logger
def sum_num( a, b, c ):
    return a + b + c

3.参数检查

from itertools import izip

rpc_info = {}

def xmlrpc( in_args = (), out_args = ( type( None ), ) ):

    def _check_types( elements, types ):
        if len( elements ) != len( types ):
            raise TypeError( 'argument count is wrong' )
        typed = enumerate( izip( elements, types ) )
        for index, couple in typed:
            arg, type_ = couple
            if isinstance( arg, type_ ):
                continue
            raise TypeError( 'arg %d should be %s'%( index, type_ ) )

    def _xmlrpc( func ):
        function_name = func.__name__
        rpc_info[function_name] = ( in_args, out_args )

        def __xmlrpc( *args ):
            check_args = args[1:]
            _check_types( check_args, in_args )
            result = func( *args )
            if not type( result ) in ( tuple, list ):
                check_results = ( result, )
            else:
                check_results = result
            _check_types( check_results, out_args )
            return result

        return __xmlrpc

    return _xmlrpc

class RPCView( object ):

    @xmlrpc( ( int, int ) )
    def method1( self, int_a, int_b ):
        print 'recevied %d and %d'%( int_a, int_b )

    @xmlrpc( ( str, ), ( int, ) )
    def method2( self, info ):
        print 'received %s'%( info )
        return 0

a = RPCView()
a.method1( 12, 21 )

4.代理

class User( object ):
    def __init__( self, role ):
        self.roles = role

class Unauthorized( Exception ):
    pass

def protect( role ):
    def _protect( function ):
        def __protect( *args, **kwargs ):
            user = globals().get( 'user' )
            if user is None or role not in user.roles:
                raise Unauthorized( 'I will not tell you' )
            return function( *args, **kwargs )
        return __protect
    return _protect

tarek = User( ( 'admin', 'user' ) )
bill = User( ( 'user', ) )

class MySecrets( object ):

    @protect( 'admin' )
    def waffle_recipe( self ):
        print 'use tons of butter!'

these_are = MySecrets()
#these_are.waffle_recipe()

user = tarek
these_are.waffle_recipe()

these_are = bill
these_are.waffle_recipe()

5.上下文提供者

from threading import RLock

lock = RLock()

def synchronized( function ):
    def _synchronized( *args, **kwargs ):
        lock.acquire()
        try:
            return function( *args, **kwargs )
        finally:
            lock.release()
    return _synchronized

@synchronized
def thread_safe():
    pass

python 装饰器与AOP

时间: 2024-10-29 23:14:22

python 装饰器与AOP的相关文章

python装饰器简介

在了解装饰器的之前一定要先了解函数作为参数传递, 什么是函数内嵌,请参考我之前写的博客函数简介 python装饰器思想有点类似设计模式的装饰模式, 其意图是动态地给函数对象添加额外的功能.比如像增加日志打印的功能,有点面向切面编程(AOP)的感觉. 装饰器语法 以@开头,接着后面跟着的是装饰器的名字和可选的参数.装饰器语法是一种语法糖. 格式如下 @decomaker(deco_args) def foo(func_opt_args) 可以组合,等价于foo = g(f(foo)) @g @f

Python装饰器详解,详细介绍它的应用场景

装饰器的应用场景 附加功能 数据的清理或添加: 函数参数类型验证 @require_ints 类似请求前拦截 数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改 为函数提供额外的数据 mock.patch 函数注册 在任务中心注册一个任务 注册一个带信号处理器的函数 不同应用场景下装饰器实现 函数注册表 简单注册表 funcs = [] def register(func): funcs.append(func) return func @register def a(): r

5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器

一.什么是装饰器? 实际上装饰器就是个函数,这个函数可以为其他函数提供附加的功能. 装饰器在给其他函数添加功能时,不会修改原函数的源代码,不会修改原函数的调用方式. 高阶函数+函数嵌套+闭包 = 装饰器 1.1什么是高阶函数? 1.1.1函数接收的参数,包涵一个函数名. 1.1.2 函数的返回值是一个函数名. 其实这两个条件都很好满足,下面就是一个高阶函数的例子. def test1(): print "hamasaki ayumi" def test2(func): return t

python装饰器通俗易懂的解释!

python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说明一下: 小P闲来无事,随便翻看自己以前写的一些函数,忽然对一个最最最基础的函数起了兴趣: 1 def sum1(): 2 sum = 1 + 2 3 print(sum) 4 sum1() 此时小P想看看这个函数执行用了多长时间,所以写了几句代码插进去了: 1 import time 2 3 def

python装饰器1

第八步:让装饰器带 类 参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 # -*- coding:gbk -*- '''示例8: 装饰器带类参数''' class locker:     def __init__(self):         print("locker.__init__() should be not called.")   

Python装饰器由浅入深

装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们以装饰函数为例子介绍其用法.要理解在Python中装饰器的原理,需要一步一步来.本文尽量描述得浅显易懂,从最基础的内容讲起. (注:以下使用Python3.5.1环境) 一.Python的函数相关基础 第一,必须强调的是python是从上往下顺序执行的,而且碰到函数的定义代码块是不会立即执行它的,只

python 装饰器学习(decorator)

最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initial decorator" f() def __call__(self): print "call decorator" @decorator def fun(): print "in the fun" print "after " fun

【转】九步学习python装饰器

本篇日志来自:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 纯转,只字未改.只是为了学习一下装饰器.其实现在也是没有太看明白,对于装饰器我就是用的时候找例子,能蒙对,但是用过之后一段时间就忘了.还是用的少.有空应该好好看一看的,包括闭包.对于各种现代编程语言来说闭包都是很重要的.在这里先谢过原作者,如有侵权请告知. =-=-=-=-=-=-=-=-=-=-一条不怎么华丽的分隔线-=-=-=-=-=-=-=-=-=-= 这

【Python之旅】第四篇(一):Python装饰器

有时候拿到一个程序接口,需要对其进行扩展,但是又不能修改原来接口的源代码,这时候就需要使用装饰器了. 有下面一个小程序,假如是别人提供给我们的调用接口: import time def sayHi():         time.sleep(1)         print 'Hello, I am xpleaf.' 一般情况下,如果想要计算该程序的执行时间(因为有可能要对该接口进行某些性能上的测试),就需要把以上接口修改为下面这样,同时执行一下: 程序代码: import time def s