标签:python
带参数的装饰器
__author__ = ‘similarface‘ import sys import logging import functools logging.basicConfig( stream=sys.stderr, level=logging.DEBUG ) def decorator(config): def concrete_decorator(function): def wrapped( *args, **kw ): return function( *args, ** kw ) return wrapped return concrete_decorator def debug_named(log_name): def concrete_decorator(function): @functools.wraps( function ) def wrapped( *args, **kw ): log= logging.getLogger( log_name ) log.debug( "%s( %r, %r )", function.__name__, args, kw, ) result= function( *args, **kw ) log.debug( "%s = %r", function.__name__, result ) return result return wrapped return concrete_decorator @debug_named( "recursion" ) def ackermann( m, n ): if m == 0: return n+1 elif m > 0 and n == 0: return ackermann( m-1, 1 ) elif m > 0 and n > 0: return ackermann( m-1, ackermann( m, n-1 ) ) print( ackermann(2,4) )
类方法装饰器
import sys
import logging
import functools
def audit( method ):
@functools.wraps(method)
def wrapper( self, *args, **kw ):
audit_log= logging.getLogger( ‘audit‘ )
before= repr(self)
try:
result= method( self, *args, **kw )
after= repr(self)
except Exception as e:
audit_log.exception( ‘%s before %s\n after %s‘, method.__qualname__, before, after )
raise
audit_log.info( ‘%s before %s\nafter %s‘, method.__qualname__, before, after )
return result
return wrapper
class Person:
def __init__( self,*address ):
self.address=list(address)
@audit
def __iadd__( self, addr ):
self.address.append(addr)
return self
def __repr__( self ):
address= ", ".join( map(str,self.address) )
return "{__class__.__name__}({addr})".format(__class__=self.__class__, addr=address)
logging.basicConfig( stream=sys.stderr, level=logging.DEBUG )
p= Person("北京","上海","天津")
p.__iadd__(‘广东‘)类装饰器
__author__ = ‘similarface‘
import sys
import logging
logging.basicConfig( stream=sys.stderr, level=logging.DEBUG )
def logged(class_):
class_.logger=logging.getLogger(class_.__qualname__)
return class_
@logged
class Person:
def __init__(self,name):
self.name=name
self.logger.info("Good")
def method(self,*args):
self.logger.info("method %r",args)
@logged
class Student(Person):
def __init__(self,g):
self.name=g
self.logger.info("Good")
def study(self,*args):
self.logger.info("method %r",args)
p=Person("similarface")
p.method("Nice day")
s=Student("similarface")
s.method("Nice a day")标签:python
原文地址:http://similarface.blog.51cto.com/3567714/1871122