python装饰器

发布于 2022-09-07 20:21:24 字数 625 浏览 32 评论 0

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={} 这一段却会被执行。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

独孤求败 2022-09-14 20:21:24

简单来说:

  • 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()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文