美文网首页
Python实现单例模式

Python实现单例模式

作者: Vk_醉曦风 | 来源:发表于2020-07-18 22:46 被阅读0次

语言是共通的,想要用不同语言实现单例模式,首先要清楚什么是单例模式,单例模式即一个类有且仅有一个实例,那么通过python怎么实现一个类只能有一个实例呢。

首先先创建一个类,比如宇宙只有一个地球

class Earth:
        pass
     
a = Earth()
print(id(a))
b = Earth()
print(id(b))

通过打印实例的id可以发现,地球类默认创建了两个实例。
那么怎么能够让类只创建一个实例,而后再创建的实例是返回上一次的对象的引用呢?
一 . 基于new方法实现(推荐使用,方便)
python中,一个类创建对象实例是通过调用父类object的 new(cls)方法来创建对象的
我们可以通过重写 new(cls)方法去实现类只创建一个实例
代码如下:

class Earth(object):
     __instance=None #定义一个类属性做判断
    def __new__(cls):    
        if cls.__instance==None:
            #如果__instance为空证明是第一次创建实例
            #通过父类的__new__(cls)创建实例
            cls.__instance==object.__new__(cls)
            return  cls.__instance
        else:
            #返回上一个对象的引用
            return cls.__instance
     
    a = Earth()
    print(id(a))
    b = Earth()
    print(id(b))

可以看出它们id相同,是同一个对象。

二.使用模块
其实,Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。如果我们真的想要一个单例类,可以考虑这样做:

mysingleton.py

class Singleton(object):
    def foo(self):
        pass
singleton = Singleton()

将上面的代码保存在文件 mysingleton.py 中,要使用时,直接在其他文件中导入此文件中的对象,这个对象即是单例模式的对象

from a import singleton

三. 使用装饰器

def _singleton(*args, **kargs):
    if cls not in _instance:
        _instance[cls] = cls(*args, **kargs)
        return _instance[cls]
    return _singleton

@Singleton
class A(object):
    a = 1
    def __init__(self, x=0):
        self.x = x

a1 = A(2)
a2 = A(3)</pre>

相关文章

网友评论

      本文标题:Python实现单例模式

      本文链接:https://www.haomeiwen.com/subject/rglqkktx.html