[关闭]
@Scrazy 2016-02-15T08:34:29.000000Z 字数 1407 阅读 860

装饰器(decorator)


python学习笔记


基于函数的decorator

  1. def decorator(F):
  2. def new_F(a, b):
  3. print('input:', a, b)
  4. return F(a, b)
  5. return new_F
  6. @decorator
  7. def square_sum(a, b):
  8. return a**2 + b** 2
  9. @decorator
  10. def square_diff(a, b):
  11. return a**2 - b** 2
  12. print(square_sum(3, 4))
  13. print(square_diff(3, 4))

运行

  1. /usr/bin/python3.4
  2. input: 3 4
  3. 25
  4. input: 3 4
  5. -7

当然也可以两个装饰器一起使用
函数的执行顺序由@decorator的顺序决定

  1. def decorator(F):
  2. def new_F(a, b):
  3. print('input:', a, b)
  4. return F(a, b)
  5. return new_F
  6. def decorator1(F):
  7. def new_F(a, b):
  8. print('This is key')
  9. return F(a, b)
  10. return new_F
  11. @decorator
  12. @decorator1
  13. def square_sum(a, b):
  14. return a**2 + b** 2
  15. @decorator1
  16. @decorator
  17. def square_diff(a, b):
  18. return a**2 - b** 2
  19. print(square_sum(3, 4))
  20. print(square_diff(3, 4))

运行

  1. /usr/bin/python3.4
  2. This is key
  3. input: 3 4
  4. 25
  5. input: 3 4
  6. This is key
  7. -7

带参数的decorator

  1. #新的包装层
  2. def pre_str(pre=''):
  3. #以前的decorator
  4. def decorator(F):
  5. def new_F(a, b):
  6. print(pre + ' :input', a, b)
  7. return F(a, b)
  8. return new_F
  9. return decorator
  10. @pre_str('Lambda')
  11. def square_sum(a, b):
  12. return a**2 + b**2
  13. @pre_str('Alpha')
  14. def square_diff(a, b):
  15. return a**2 - b**2
  16. print(square_sum(3, 4))
  17. print(square_diff(3, 4))

运行

  1. /usr/bin/python3.4
  2. Lambda :input 3 4
  3. 25
  4. Alpha :input 3 4
  5. -7

装饰类

跳过

  1. def decorator(aClass):
  2. class newClass:
  3. def __init__(self, age):
  4. self.total_display = 0
  5. self.wrapped = aClass(age)
  6. def display(self):
  7. self.total_display += 1
  8. print("total display", self.total_display)
  9. self.wrapped.display()
  10. return newClass
  11. @decorator
  12. class Bird:
  13. def __init__(self, age):
  14. self.age = age
  15. def display(self):
  16. print("My age is",self.age)
  17. eagleLord = Bird(5)
  18. for i in range(3):
  19. eagleLord.display()

参考来源

Vamei Python快速教程

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注