用元类实现singleton

2024-05-03 12:56:35 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码是我如何用元类实现singleton的,它工作得很好

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()

输出:

^{pr2}$

我的问题是为什么b = A()直接转到Test_MetaClass.__call__而忽略{}?在


Tags: instancetestnoneinitdefargscalldict
1条回答
网友
1楼 · 发布于 2024-05-03 12:56:35

这不是你想要的吗?cls._instance不是None,因此它不会执行type.__call__(cls, *args, **kwargs)

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

正是通过这个调用,A.__new__和{}被调用来创建/初始化一个新实例。但对于你的单身汉来说,你只需要一个实例。在

相关问题 更多 >