q987654 发表于 2018-8-15 11:18:09

python 装饰器从放弃到玩转(中级)

  前面我们说到装饰器的初步使用
  需求一:
  那我现在有个需求,原函数是这样的
  def test1():
  a = "test1"
  time.sleep(3)
  returna
  可以看到是有返回值的,可我们之前的装饰器,并没有处理原函数的返回值的逻辑,那么我现在怎么办,看代码
  def record_time(func):
  def warpper():
  start_time = time.time()
  a = func()
  end_time = time.time()
  print "总共用时:" + str(int(end_time) - int(start_time))
  return a
  return warpper
  @record_time
  def test1():
  a = "test1"
  time.sleep(3)
  return a
  r = test1()
  print r
  步骤解释:

[*]  @record_time== test1=record_time(test1)=warpper
[*]  r = test1()
  test1() == warpper()
  里面直接return了原test1函数的返回值
[*]  r = 原test1的返回值
  需求一:
  def test1(name):
  a = name
  time.sleep(3)
  returna
  def test2(name,age):
  a = name
  b = age
  dict = {}
  dict["name"] = a
  dict["age"] = age
  time.sleep(3)
  returndict
  我现在的函数需要传值,并且每个函数可能传的参数不是固定的,要求记录函数的执行时间
  请看实现的代码如下
  def record_time(func):
  def warpper(*args,**kwargs):
  start_time = time.time()
  a = func()
  end_time = time.time()
  return a
  return warpper
  @record_time
  def test1(name):
  a = name
  time.sleep(3)
  returna
  @record_time
  def test2(name=name ,age=age):
  a = name
  b = age
  dict = {}
  dict["name"] = a
  dict["age"] = age
  time.sleep(3)
  returndict
  r = test1("test01")
  r1 = test2("test02",20)
  print r,r1
  解释:

[*]  @record_time == test1 = record_time(test1) = warpper(前面忘讲了,这个就是warpper的内存地址)
[*]  @record_time == test2 = record_time(test2) = warpper
[*]  test1("test01")== warpper("test01"),而warpper函数可以允许你传入不固定参数*agrs(元祖)和关键字参数(**kwargs)
[*]  warpper中执行了原来的test01和test02
[*]  返回各自的结果
页: [1]
查看完整版本: python 装饰器从放弃到玩转(中级)