在python中将参数传递给单例

时间:2013-06-19 22:52:07

标签: python singleton

我正在使用以下代码在python中实例化一个单例:

class Singleton(type):
    def __init__(cls, name, bases, dic):
        super(Singleton, cls).__init__(name, bases, dic)
        cls.instance = None

    def __call__(cls, *args, **kwargs):
        if cls.instance is None:
            if DEBUG:
                print("Creating NEW Orchestrator instance")
        else:
            if DEBUG:
                print("Using EXISTING Orchestrator instance")

            cls.instance = super(Singleton, cls).__call__(*args, **kwargs)

        return cls.instance

init 如下所示:

def __init__(self, arg=None):
    ...

当我实例化对象时,它似乎不接受参数:

Obj = Object("parameter")

arg不等于"parameter"。它是无。

我认为这是将* args传递给调用的目的。 在首次实例化单例时我如何传递参数?

2 个答案:

答案 0 :(得分:2)

更好地使用它:

class Singleton(type):
    def __init__(cls,name,bases,dic):
        super(Singleton,cls).__init__(name,bases,dic)
        cls.instance=None
    def __call__(cls,*args,**kw):
        if cls.instance is None:
            cls.instance=super(Singleton,cls).__call__(*args,**kw)
        return cls.instance

class Object(object):
    __metaclass__ = Singleton
    def __init__(self, a=None):
        print a 

c = Object("parameter")

我想......

注意:这适用于Python 2.7.4

答案 1 :(得分:2)

使用当前的Singleton类,以下内容似乎在Python 3.x上运行正常(我假设您使用的是基于print函数。

class Object(metaclass=Singleton):
    def __init__(self, arg=None):
        print("creating instance with arg:", arg)

例如:

>>> Object("parameter")
creating NEW Orchestrator instance
creating instance with arg: parameter
<__main__.Object object at 0x7f45f9ce8910>
>>> Object("foobar")   # returns the same instance as the above call
<__main__.Object object at 0x7f45f9ce8910>

编辑:你可以在Python 2.x上做同样的事情,指定元类的语法有点不同:

class Object(object):
    __metaclass__ = Singleton
    def __init__(self, arg=None):
        print("creating instance with arg:", arg)