为了账号安全,请及时绑定邮箱和手机立即绑定

python装饰器

python装饰器

守着一只汪 2018-08-10 16:53:47
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={} 这一段却会被执行。
查看完整描述

1 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

简单来说:

  • 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()


查看完整回答
反对 回复 2018-08-12
  • 1 回答
  • 0 关注
  • 666 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信