使用metaclass实现单例模式

5 投票
1 回答
3156 浏览
提问于 2025-04-16 22:38

下面的代码是我如何用元类实现单例模式的,它运行得很好。

class Test_MetaClass(type):

    def __init__(cls, name, bases, dict):
        super(Test_MetaClass, cls).__init__(cls, bases, dict)
        cls._instance = None
        print 'Test_MetaClass __init__'

    def __call__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super(Test_MetaClass, cls).__call__(*args, **kwargs)
        print 'Test_MetaClass __call__'
        return cls._instance


class A(object):
    __metaclass__ = Test_MetaClass
    def __init__(self):
        print 'A __init__ triggered'

a = A()
b = A()

输出结果:

Test_MetaClass __init__
A __init__ triggered
Test_MetaClass __call__
Test_MetaClass __call__

我想问的是,为什么 b = A() 直接调用了 Test_MetaClass.__call__,而忽略了 __init__ 呢?

1 个回答

2

这不是你想要的吗?因为 cls._instance 不是空的,所以不会执行 type.__call__(cls, *args, **kwargs)

>>> type.__call__(A)
A __init__ triggered
<__main__.A object at 0x00BADB30>

正是通过这个调用,A.__new__A.__init__ 被调用来创建和初始化一个新的实例。但是对于你的单例模式来说,你只想要一个实例。

撰写回答