python装饰器

from functools import wrapsdef single(cls):
    sets={}
    print(sets)  
    @wraps(cls)
    def wrapper(*args,**kw):
        if 'ex' not in sets:
            sets['ex']=cls(*args,**kw)        return sets['ex']    return wrapper@singleclass B:
    passb=B()
b.a="hello bachelor"a=B()
d=single(B)
print(c.a)

通过装饰器实现的单例模式,但是有一个地方不是特别理解:

代码中通过object=B()这种方式创建两个B的实例,为什么

 sets={} print(sets)

这段只被执行了一次。

另一个不解的地方是

@decoratorclass B:    pass不是等价于
decorator(B)的吗

但是在代码中如果用 d=single(B)这种写法, sets={} 这一段却会被执行。


守着一只汪
浏览 667回答 1
1回答

繁花如伊

简单来说:print代码只是在装饰器第一次声明class B时调用,去掉下面的代码也会执行b=B()b.a="hello bachelor"a=B() d=single(B)print(c.a)d=single(B)相当于重新执行了一遍single函数,自上而下PS:你可以首部使用下方代码看下具体执行过程(输入s单步执行)import pdb;pdb.set_trace()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python