【发布时间】:2011-10-17 05:45:56
【问题描述】:
下面的代码是我如何使用元类实现单例,并且效果很好
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__?
【问题讨论】:
-
您的元类可以更简单。不是答案,因此您必须处理评论格式。
class Singleton(type): cls._instance = None; def __call__(cls, *args, **kwargs): if cls._instance is None: cls._instance = super(Singleton, cls).__call__(*args, **kwargs); return cls._instance;
标签: python python-2.x metaclass