Python中有关修饰函数的问题

最近在研究 python 修饰函数,虚心请教如下问题。废话不说,先上代码:

import time
from datetime import datetime
from datetime import timedelta

def time_func(time_interval, default=None): def decorator(func): func.__last_run = datetime.min def guard(*args, **kwargs): now = datetime.now() if now - func.__last_run >= time_interval: func.__last_run = now return func(*args, **kwargs) elif default is not None: return default(*args, **kwargs) return guard return decorator

if name == “main”:

@time_func(timedelta(seconds=4),None)
def add():
    print('test')

add()
add()

执行结果: 只显示一个'test'

问题: 这个代码实现了在规定时间内( time_interval )限制了函数 add ()的运行次数,只让它运行一次,其余忽略。 请问此代码中为何在执行第二遍 add()的时候跳过了开头的 func.__last_run = datetime.min 而直接进入 guard 中的代码?该怎样理它的解运作原理? Python 新手,十分感谢!


Python中有关修饰函数的问题

4 回复

我无法理解你的问题

这么说吧,你不要调用 add(), 直接在 ipython 里面输入 add, 你会看到 add 其实不是 add 了,而是
<function main.time_func.<locals>.decorator.<locals>.guard(*args, **kwargs)>,
其实是 guard,但是这个 guard 绑定了一个它的外部变量,__last_run

回到顶部