Python-装饰器函数

两天的内容:(装饰器)

# 装饰器-简单版
import time
def func1():
      print('in func1')
def timer(func):
      def inner():
            start = time.time()
            func()
            print(time.time() - start)
      return inner
func1 = timer(func1)
func1()
# 装饰器-语法糖
import time
def timer(func):
      def inner():
            start = time.time()
            func()
            print(time.time() - start)
      return inner
@timer # ==>func1 = timer(func1)
def func1():
      print('in func1')
func1()

对于用户来说,感知不到装饰器的存在  在一个函数的前后添加功能

装饰器的本质:一个闭包函数

装饰器的功能:在不修改原函数及其调用的情况下对原函数功能进行扩展

# 带参数的装饰器
import time
def timer(func):
      def inner(a):
            start = time.time()
            func(a)
            print(time.time() - start)
      return inner
@timer
def func1(a):
      print(a)
func1(1)
# 装饰器-可以hold住所有函数传参
import time
def timmer(func):
      def inner(*args,**kwargs):
            start = time.time()
            re = func(*args,**kwargs)
            print(time.time() - start)
            return re
      return inner
@timmer
def func1(a,b):
      print('in func1')
@timmer
def func2(a):
      print('in func2 and get a:%s'%a)
      return 'func2 over'
func1('asasas','bffbfbf')
print(func2('asasas'))
import time
def timer(func):
      def inner(*args,**kwargs):
            start = time.time()
            re = func(*args,**kwargs)
            print(time.time() - start)
            return re
      return inner
@timer
def func2(a):
      print('in func2 and get a:%s'%(a))
      return 'func2 over'
func2('aaaa','bbbb')
print(func2('aaaa'))
开放封闭原则
1.对扩展是开放的
为什么要对扩展开放呢?
任何一个程序,不可能是在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。
所以我们必须允许代码扩展、添加新功能
2.对修改是封闭的
为什么要对修改封闭呢?
我们写的一个函数,很可能已经交付给其他人使用,如果这个时候我们对其进行了修改,很有
可能影响其他已经使用该函数的用户。
装饰器完美的遵循了这个开放封闭原则
装饰器的主要功能:
在不改变函数调用方式的基础上在函数的前、后添加功能
#装饰器的固定格式:
def timer(func):
      def inner(*args,**kwargs):
            '''执行函数之前要做的'''
            re= func(*args,**kwargs)
            '''执行函数之后要做的'''
            return re
      return inner
#带参数的装饰器
def outer(flag):
      def timer(func):
            def inner(*args,**kwargs):
                  if flag:
                        print('''执行函数之前要做的''')
                  re = func(*args,**kwargs)
                  if flag:
                        print('''执行函数之后要做的''')
                  return re
            return inner
      return timer
@outer(False)
def func():
      print(111)
func()
#多个装饰器同一个函数
def wrapper1(func):
      def inner():
            print('wrapper1,before func')
            func()
            print('wrapper,after func')
      return inner
def wrapper2(func):
      def inner():
            print('wrapper2,befor func')
            func()
            print('weapper2,after func')
      return inner
@wrapper2
@wrapper1
def f():
      print('in f')
f()

 

posted @ 2017-09-01 19:09  程先生_Python  阅读(110)  评论(0)    收藏  举报