为什么python中的Singleton多次调用__init__以及如何避免它?
发布时间:2020-12-20 11:44:07 所属栏目:Python 来源:网络整理
导读:我在 python中实现了单例模式,但我注意到了 尽管返回了相同的实例,每次调用MyClass时都会调用init,这是无用的. 我怎么能避免呢? class Test(object): def __init__(self,*args,**kwargs): object.__init__(self,**kwargs)class Singleton(object): _instanc
我在
python中实现了单例模式,但我注意到了
尽管返回了相同的实例,每次调用MyClass时都会调用init,这是无用的. 我怎么能避免呢? class Test(object): def __init__(self,*args,**kwargs): object.__init__(self,**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,mmbs) self._instance = super(Singleton,self).__call__() def __call__(self,**kw): return self._instance class Test(metaclass = Singleton): # __metaclass__ = Singleton # in python 2.7 def __init__(self,**kw): print("Only ever called once") (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |