python反柯里化和修饰器注意点
def singleton(cls, *args, **kw): instances = {} print(str(cls) + str(instances)) def _singleton(*args, **kw): print(str(cls) + str(instances)) if "data" not in instances : instances['data'] = cls(*args, **kw) return instances['data'] return _singleton @singleton class ttt(): def __init__(self,a,b): self.a = a print("tttttttttt") def print(self): print(self.a) @singleton class aaa(): def __init__(self,a,b): self.a = a print("aaaaa") def print(self): print(self.a) class bbb(): def __init__(self,a,b): self.a = a print("bbbb") def print(self): print(self.a) if __name__ == "__main__": a = ttt(1,2) aa = aaa(11, 22) b = ttt(3,4) bb = aaa(33, 44) a.print() b.print() aa.print() bb.print() singleton(bbb)(55,66).print() singleton(bbb)(77,88).print()
<class ‘__main__.ttt’>{}
<class ‘__main__.aaa’>{}
<class ‘__main__.ttt’>{}
tttttttttt
<class ‘__main__.aaa’>{}
aaaaa
<class ‘__main__.ttt’>{‘data’: <__main__.ttt object at 0x000001B5ADBBB320>}
<class ‘__main__.aaa’>{‘data’: <__main__.aaa object at 0x000001B5ADBBB400>}
1
1
11
11
<class ‘__main__.bbb’>{}
<class ‘__main__.bbb’>{}
bbbb
55
<class ‘__main__.bbb’>{}
<class ‘__main__.bbb’>{}
bbbb
77
从输出结果来看 singleton当做修饰器的时候, 仅在第一次使用的时候先调用singleton 函数, 再调用 singleton内的_singleton函数. 第二次使用的时候跳过了singleton函数直接调用singleton内的_singleton函数.
后面直接调用singleton函数的时候, 就会”老实”的按照顺序执行.