加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

为什么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")

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读