huijial 发表于 2018-8-16 10:59:25

python装饰器关键代码

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__('广东')


页: [1]
查看完整版本: python装饰器关键代码