问题可能的出处:
1、闭包调用闭包内的某个属性报错
2、调用函数内部的属性
出处1就是根本原因还是2引起的
解释
- 需要理解下当类被装饰器修饰后,类已经变成了闭包内返回的一个函数。
def counter(cls):
obj_list = []
def wrapper(*args, **kwargs):
new_obj = cls(*args, **kwargs)
obj_list.append(new_obj)
print("class:%s'object number is %d" % (cls.__name__, len(obj_list)))
return new_obj
return wrapper
@counter
class my_cls(object):
STATIC_MEM = 'This is a static member of my_cls'
def __init__(self, *args, **kwargs):
print(self, args, kwargs)
print(my_cls.STATIC_MEM)
# <function counter.<locals>.wrapper at 0x00000179D6C04158>
print(my_cls)
# AttributeError: 'function' object has no attribute 'STATIC_MEM'
print(my_cls())
解决办法:print(my_cls.STATIC_MEM)修改为print(self.STATIC_MEM)
- 根本原因是因为虽然函数是对象,但是,函数内属性无法调用,见下
def my_cls():
STATIC_MEM = 'This is a static member of my_cls'
# AttributeError: 'function' object has no attribute 'STATIC_MEM'
print(my_cls.STATIC_MEM)
参考:
理解Python闭包概念.