装饰器要求接受一个callable对象,并返回一个callable对象

1、内置的装饰器

1.1 property

  1. class Student(object):
  2. def __init__(self):
  3. super().__init__()
  4. self._score = None
  5. @property
  6. def score(self):
  7. return self._score
  8. @score.setter
  9. def score(self, value):
  10. if not isinstance(value, int):
  11. raise ValueError('score must be an integer!')
  12. if value < 0 or value > 100:
  13. raise ValueError('score must between 0 ~ 100!')
  14. self._score = value

2、自定义装饰器

2.1 函数装饰器

  1. def log(func):
  2. def wrapper(*awg, **kw):
  3. if not callable(func):
  4. raise ValueError('function')
  5. print(func.__name__)
  6. return func()
  7. return wrapper
  8. @log
  9. def now():
  10. print(datetime.now())
  11. now()
  12. # 相当于 now = log(now)

2.2 类装饰器

实现call方法

  1. class logging(object):
  2. def __init__(self, level='INFO'):
  3. self.level = level
  4. def __call__(self, func): # 接受函数
  5. def wrapper(*args, **kwargs):
  6. print "[{level}]: enter function {func}()".format(
  7. level=self.level,
  8. func=func.__name__)
  9. func(*args, **kwargs)
  10. return wrapper #返回函数
  11. @logging(level='INFO')
  12. def say(something):
  13. print "say {}!".format(something)