使用metaclass实现单例模式
下面的代码是我如何用元类实现单例模式的,它运行得很好。
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__
被调用来创建和初始化一个新的实例。但是对于你的单例模式来说,你只想要一个实例。