bananatree 发表于 2020-3-17 22:18:44

关于被修饰的函数的重新引用问题

第一段代码,最后一句对f函数的引用需要加():
import time
class timeslong(object):
    def __init__(self,func):
      self.f = func
    def __call__(self):
      start = time.clock()
      print("It's time starting ! ")
      self.f()
      print("It's time ending ! ")
      end = time.clock()
      return "It's used : %s ." % (end - start)

@timeslong
def f():
    y = 0
    for i in range(10):
      y = y + i + 1
      print(y)
   

print(f())

第二段代码,最后一句对f函数的引用没有加():
import time


def call(func):
    start = time.perf_counter()
    print("It's time starting ! ")
    func()
    print("It's time ending ! ")
    end = time.perf_counter()
    return "It's used : %s ." % (end - start)


@call##修饰会自动将下面的部分作为一个参数导入到call函数中
def f():
    y = 0
    for i in range(10):
      y = y + i + 1
      print(y)
   

print(f)

Stubborn 发表于 2020-3-17 22:18:45

本帖最后由 Stubborn 于 2020-3-18 03:40 编辑

虽然不知道你这么做的原因,假如你的问题是为什么有一个加了()有一个为什么没有加的话,你应该去在仔细看下修饰符的使用,或者参考Python cookbook [https://fishc.com.cn/thread-153981-1-1.html]

import time
from functools import wraps


def timethis(function):
    @wraps(function)
    def wrapper(*args, **kwargs):
      start = time.time()
      function(*args, **kwargs)
      print(function.__name__, start - time.time())

    return wrapper

def downout(n):
    while n > 0:
      n -= 1


downout = timethis(downout)
downout(10000)
你要看懂末尾两行,作为装饰符的等价调用,套用到你的代码里面会发生什么。当然你也可以尝试,把第二段代码的 print(f) 去掉,看看有什么结果

wangka 发表于 2020-3-18 07:42:02

???

bananatree 发表于 2020-3-19 11:34:58

Stubborn 发表于 2020-3-18 03:38
虽然不知道你这么做的原因,假如你的问题是为什么有一个加了()有一个为什么没有加的话,你应该去在仔细看 ...

之前不明白,函数修饰其的用法,原来那个修饰之后,会自动添加一个调用的()所以必须添加一个子函数,谢谢提醒
页: [1]
查看完整版本: 关于被修饰的函数的重新引用问题