• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

python如何实现单例模式

python 搞代码 4年前 (2022-01-09) 26次浏览 已收录 0个评论

python如何实现单例模式?下面给大家带来七种不同的方法:

一:staticmethod

代码如下:

class Singleton(object):    instance = None    def __init__(self):        raise SyntaxError('can not instance, please use get_instance')    def get_instance():        if Singleton.instance is None:            Singleton.instance = object.__new__(Singleton)        return Singleton.instancea = Singleton.get_instance()b = Singleton.get_instance()print('a id=', id(a))print('b id=', id(b))

该方法的要点是在__init__抛出异常,禁止通过类来实例化,只能通过静态get_instance函数来获取实例;因为不能通过类来实例化,所以静态get_instance函数中可以通过父类object.__new__来实例化。

二:classmethod

和方法一类似,代码:

class Singleton(object):    instance = None    def __init__(self):        raise SyntaxError('can not instance, please use get_instance')    def get_instance(cls):        if Singleton.instance is None:            Singleton.instance = object.__new__(Singleton)        return Singleton.instancea = Singleton.get_instance()b = Singleton.get_instance()print('a id=', id(a))print('b id=', id(b))

该方法的要点是在__init__抛出异常,禁止通过类来实例化,只能通过静态get_instance函数来获取实例;因为不能通过类来实例化,所以静态get_instance函数中可以通过父类object.__new__来实例化。

三:类属性方法

和方法一类似, 代码:

class Singleton(object):    instance = None    def __init__(self):        raise SyntaxError('can not instance, please use get_instance')    def get_instance():        if Singleton.instance is None:            Singleton.instance = object.__new__(Singleton)        return Singleton.instancea = Singleton.get_instance()b = Singleton.get_instance()print(id(a))print(id(b))

该方法的要点是在__init__抛出异常,禁止通过类来实例化,只能通过静态get_instance函数来获取实例;因为不能通过类来实例化,所以静态get_instance函数中可以通过父类object.__new__来实例化。

四:__new__

常见的方法, 代码如下:

class Singleton(object):    instance = None    def __new__(cls, *args, **kw):        if not cls.instance:            # cls.instance = object.__new__(cls, *args)            cls.instance = super(Singleton, cls).__new__(cls, *args, **kw)        return cls.instancea = Singleton()b = Singleton()print(id(a))print(id(b))

相关推荐:《Python视频教程》

五:装饰器

代码如下:

def Singleton(cls):    instances = {}    def getinstance():        if cls not in instances:            instances[cls] = cls()        return instances[cls]    return getinstanceclass MyClass:    passa = MyClass()b = MyClass()c = MyClass()print(id(a))print(id(b))print(id(c))

六:元类

python2版:

class Singleton(type):    def __init__(cls, name, bases, dct):        super(Singleton, cls).__init__(name, bases, dct)        cls.instance = None    def __call__(cls, *args):        if cls.instance is None:            cls.instance = super(Singleton, cls).__call__(*args)        return cls.instanceclass MyClass(object):    __metaclass__ = Singletona = MyClass()b = MyClass()c = MyClass()print(id(a))print(id(b))print(id(c))print(a is b)print(a is c)

或者:

class Single<strong>本文来源gaodaima#com搞(代@码$网6</strong>ton(type):    def __new__(cls, name, bases, attrs):        attrs["_instance"] = None        return super(Singleton, cls).__new__(cls, name, bases, attrs)    def __call__(cls, *args, **kwargs):        if cls._instance is None:            cls._instance = super(Singleton, cls).__call__(*args, **kwargs)        return cls._instanceclass Foo(object):    __metaclass__ = Singletonx = Foo()y = Foo()print(id(x))print(id(y))

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:python如何实现单例模式

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址