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函数的时候, 就会”老实”的按照顺序执行.


发表评论