python通俗讲解闭包 (2)

这里应该被做了类似重定向的操作(因为语法糖@counter的缘故), 此时my_cls不再是原来的class,
执行的时候my_cls这个名字被指向了counter(my_cls), 即wrapper函数。

可以打印看看print my_cls.__name__ #显示wrapper

这也是为什么能直接使用my_cls()的原因,因为它已经不再是原来的类,而是新的函数wrapper。
因此需要将my_cls.STATIC_MEN修改为self.STATIC_MEN,毕竟执行的时候my_cls已经不再是原来的my_cls了

要是还想通过my_cls访问静态属性,尝试以下方法

def counter(cls): obj_list = [] @functools.wraps(cls) def wrapper(*args, **kwargs): ... ... return wrapper

对wrapper使用functools进行了一次包裹更新,使经过装饰的my_cls看起来更像装饰之前的类或者函数。
该过程的主要原理就是将被装饰类或者函数的部分属性直接赋值到装饰之后的对象
如WRAPPER_ASSIGNMENTS(name, module and doc, )和WRAPPER_UPDATES(dict)等。
但是该过程不会改变wrapper是函数这样一个事实。

my_cls.__name__ == 'my_cls' and type(my_cls) is types.FunctionType

单例模式:https://www.cnblogs.com/yssjun/p/9858420.html

参考: https://www.cnblogs.com/yssjun/p/9887239.html

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpppsx.html