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")


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章