装饰器要求接受一个callable对象,并返回一个callable对象
1、内置的装饰器
1.1 property
class Student(object):def __init__(self):super().__init__()self._score = None@propertydef score(self):return self._score@score.setterdef score(self, value):if not isinstance(value, int):raise ValueError('score must be an integer!')if value < 0 or value > 100:raise ValueError('score must between 0 ~ 100!')self._score = value
2、自定义装饰器
2.1 函数装饰器
def log(func):def wrapper(*awg, **kw):if not callable(func):raise ValueError('function')print(func.__name__)return func()return wrapper@logdef now():print(datetime.now())now()# 相当于 now = log(now)
2.2 类装饰器
实现call方法
class logging(object):def __init__(self, level='INFO'):self.level = leveldef __call__(self, func): # 接受函数def wrapper(*args, **kwargs):print "[{level}]: enter function {func}()".format(level=self.level,func=func.__name__)func(*args, **kwargs)return wrapper #返回函数@logging(level='INFO')def say(something):print "say {}!".format(something)
