Python中使用 metaclass 实现Singleton 模式

class Singleton(type):
    def __call__(cls, *args, **kwargs):
        print "Singleton call"
        if not hasattr(cls, 'instance'):
            cls.instance = super(Singleton, cls).__call__(*args, **kwargs)
        return cls.instance
    def __new__(cls, name, bases, dct):
        print "Singleton new"
        return type.__new__(cls, name, bases, dct)

    def __init__(cls, name, bases, dct):
        print "Singleton init"
        super(Singleton, cls).__init__(name, bases, dct)

class Cache(object):
    __metaclass__ = Singleton
    def __new__(cls, *args, **kwargs):
        print "Cache new"
        return object.__new__(cls, *args, **kwargs)
    def __init__(cls, *args, **kwargs):
        print "Cache init"
    def __call__(cls, *args, **kwargs):
        print "Cache call"

print Cache()
print Cache()

 输出:

Singleton new
Singleton init
Singleton call
Cache new
Cache init
<__main__.Cache object at 0x01CDB130>
Singleton call
<__main__.Cache object at 0x01CDB130>

原文地址:https://www.cnblogs.com/tuzkee/p/2892547.html