我正在使用以下代码在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传递给调用的目的。 在首次实例化单例时我如何传递参数?
答案 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)