XuSenfeng

个人站

复读了,更新随缘,有的文件不全或者图片缺失具体看我的笔记库(https://github.com/XuSenfeng/note)


修饰器

目录

修饰器

在python中函数实际上就是一个对象

def outer(x):
    def inner(y):
        return x + y
    return inner

print(outer(6)(5))
def double(x):
    return x * 2
def triple(x):
   	return x * 3

def calc_number(func, x):
    print(func(x))

calc_number(double, 3)
calc_number(triple, 3)

函数自己也可以作为返回值

修饰器

def dec(f):
    pass

@dec
def double(x):
    return x * 2

#等价于
double = dec(double)

import time 

def timeit(f):
    def wrapper(x):
        start = time.time()
        ret = f(x)
        print(time.time() - start)
        return ret
    
    return wrapper

@timeit
def myfunction(x):
    time.sleep(x)

# myfunction(1)

@timeit
def other_func(x):
    return x*2

print(other_func(2))
import time
def timeit(f):
    def wrapper(*args, **kwargs):			#传入的参数不限制
        start = time.time()
        ret = f(*args, **kwargs)
        print(time.time() - start)
        return ret
    return wrapper


@timeit
def myfunc(x):
    time.sleep(x)

@timeit
def add(x, y):
    return x+y

print(add(2, 3))

接下来就讲装饰器,其实装饰器就是一个闭包,装饰器是闭包的一种应用。什么是装饰器呢,简言之,python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。使用时,再需要的函数前加上@demo即可。

@timeit(1000)
def double(x):
    return x*2
# 实际上等价为下面的函数
double = timeit(10)(double)

前面的返回的是一个函数, 返回的函数调用double再返回一个函数

import time
def timeit(interation):
    def inner(f):
        def wrapper(*args, **kwargs):
            start = time.time()
            for _ in range(interation):
                print("1")
                ret = f(*args, **kwargs)
            ret = f(*args, **kwargs)
            print(time.time() - start)
            return ret
    
        return wrapper
    return inner


@timeit(10)
def double(x):
    return x*2

print(double(2))

等价于

  inner = timeit(1000)
  double = inner(double)
  import time
  
  def inner(f):
      def wrapper(*args, **kwargs):
          start = time.time()
          for _ in range(10):
              print("1")
              ret = f(*args, **kwargs)
          ret = f(*args, **kwargs)
          print(time.time() - start)
          return ret
      
      return wrapper
  return inner
  
  
  @inner
  def double(x):
      return x*2