所需相关包。
import logging
from functools import partial, wraps
logging.basicConfig(level=logging.DEBUG)
- 类实例装饰器
class Obj(object):
def instance_log_decorator(self, func=None, level=logging.DEBUG):
if not func:
return partial(self.instance_log_decorator, level=level)
def wrapper(*args, **kwargs):
log = logging.getLogger(func.__module__)
log.log(level, ('execute %s!' % func.__name__))
return func(*args, **kwargs)
return wrapper
需要先创建实例。
o = Obj()
@o.instance_log_decorator
def plus(x, y):
return x + y
- 类装饰器
class Obj(object):
@classmethod
def cls_log_decorator(cls, func=None, *, level=logging.WARNING):
if not func:
return partial(cls.cls_log_decorator, level=level)
def wrapper(*args, **kwargs):
log = logging.getLogger(func.__module__)
log.log(level, ('execute %s!' % func.__name__))
return func(*args, **kwargs)
return wrapper
cls_log_decorator作为Obj的类方法直接使用。
@Obj.cls_log_decorator(level=logging.INFO)
def minus(x, y):
return x - y
- @property
class Person(object):
name = property()
@name.getter
def name(self):
return self._name
@name.setter
def name(self, value):
if not isinstance(value, str):
raise TypeError('excepted string')
self._name = value
各种不同的装饰器方法会在关联的property 实例上操作它的状态。因此,任何时候只要你碰到需要在装饰器中记录或绑定信息,那么这不失为一种可行方法。 from 《Python CookBook》9.8