我在
python中实现了单例模式,但我注意到了
尽管返回了相同的实例,每次调用MyClass时都会调用init,这是无用的.
我怎么能避免呢?
class Test(object):
def __init__(self, *args, **kwargs):
object.__init__(self, *args, **kwargs)
class Singleton(object):
_instance = None
def __new__(cls):
if not isinstance(cls._instance, cls):
cls._instance = object.__new__(cls)
return cls._instance
class MyClass(Singleton):
def __init__(self):
print("should be printed only 1 time")
self.x=Test()
pass
a = MyClass() # prints: "should be printed only 1 time"
b = MyClass() # prints ( again ): "should be printed only 1 time"
print(a,b) # prints: 0x7ffca6ccbcf8 0x7ffca6ccbcf8
print(a.x,b.x) # prints: 0x7ffca6ccba90 0x7ffca6ccba90
最佳答案 问题是__new__不返回一个对象,它返回一个在其后调用__init__的单元化对象.
你根本无法避免这种情况.你可以做的是以下(使用元类型):
class Singleton(type):
def __init__(self, name, bases, mmbs):
super(Singleton, self).__init__(name, bases, mmbs)
self._instance = super(Singleton, self).__call__()
def __call__(self, *args, **kw):
return self._instance
class Test(metaclass = Singleton):
# __metaclass__ = Singleton # in python 2.7
def __init__(self, *args, **kw):
print("Only ever called once")