9-5给wrapper添加属性ncalls为什么可以被里面调用

来源:9-5 如何在类中定义装饰器

Brook_StudyMachine

2017-01-30

    def info(self, func):     
        def wrapper(*args, **kargs):
            wrapper.ncalls += 1
            lt = localtime()
            start = time()
            res = func(*args, **kargs)
            used = time() - start
            info = {}
            info['func'] = func.__name__
            info['time'] = strftime('%x %X', lt)
            info['used'] = used
            info['ncalls'] = wrapper.ncalls
            msg = self.formatter % info
            self.log.info(msg)
            return res    
        wrapper.ncalls = 0       
        return wrapper


开始我以为wrapper.ncalls在info里,是info的一个局部变量

改写为wrapper_ncalls是报错的


把wrapper.ncalls放在def wrapper前面,也会报错


不明白为什么wrapper里面,可以调用外面声明的wrapper.ncalls

写回答

1回答

程序员硕

2017-02-03

wrapper.ncalls是函数对象的属性, 和其他实例属性一样的.

0
0

Python高效编程技巧实战

精选50个Python案例,源自实战,全面提升Python编程能力

2582 学习 · 360 问题

查看课程