python 类装饰器和函数装饰器区别_python的装饰器如果是一个类,流程和原理是怎样的?...

这里是个人对这些代码的理解,希望能为你提供一些线索:

@Singleton装饰class A 的时候,也就是以class A 作为参数给 Singleton(self._cls),就已经实例化了Singleton类并且命名为A。

然后A.instance()是调用instance()方法把在Singleton类的A里面的self._cls实例化,那么classA 的实例就变成了Singleton类实例A的一个成员属性。 这有点类似于inner class,或者nested class,inner class可以使用外部class的属性和方法,但是应该与继承有区别的。

下面这段应该是这样的:self._decorated其实就是self._cls, 我在下面网页找到类似代码,然后改了self._decorated,运行结果一样,至于为什么会这样我不了解。

http://outofmemory.cn/code-sn...

def __instancecheck__(self, inst):

return isinstance(inst, self._decorated)

__instancecheck__(self, inst):是python的魔法方法,当执行 print(isinstance(s2,A)) 时候就会触发这方法,用以判别其實例是否某class 的实例。

把def instance() 改成这样:

def Instance(self):

self._instance = self._cls()

return self._instance

运行 s1 is s2 会返False。

我们知道没有改之前,因为try except 会让 instance() return self._instance, 如果没有的话就实现一个。 造成 s1 和s2 两个id一样,我的理解应该是同一个instance吧,s1 is s2 返回True。

而改了之后,s1 和s2 就不同id了, 然后 s1 is s2 就返回False。

call 讓 A() 出錯,所以要用instance() 訪問A以實現被decorated 的class

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值