python装饰器

from functools import wraps

def 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

@single
class B:
    pass

b=B()
b.a="hello bachelor"
a=B()
d=single(B)
print(c.a)

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

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

 sets={}
 print(sets)

这段只被执行了一次。

另一个不解的地方是

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

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

阅读 2.3k
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()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题