python中实现单例模式的几种方法

1.装饰器


def singleton(cls):
    instances = {}
    def getinstance(*args,**kw):
        if cls not in instances:
            instances[cls] = cls(*args, **kw)
        return instances[cls]
    return getinstance

@singleton
class MyClass:
    def __init__(self,s):
        self.s = s

a = MyClass('apple')
b = MyClass('banana')

print(a.s)
print(b.s)
输出:
apple
apple

当一个类名不在字典内时,创建这个类的实例并作为值对应类名这个键,创建一个键值对在 instances 字典内,以后创建这个类的实例时,因为类名已存在,返回的还是第一次创建的类的实例。

2.模块

python中的模块module在程序中只被加载一次,本身就是单例的。

# mysingleton.py
class My_Singleton(object):
    def foo(self):
        pass

my_singleton = My_Singleton()

# to use
from mysingleton import my_singleton

my_singleton.foo()

3. __new__()

class Singleton(object):
    def __new__(cls, *args, **kw):
        if not hasattr(cls, '_instance'):
            cls._instance = super(Singleton,cls).__new__(cls)
        return cls._instance

class MyClass(Singleton):
    def __init__(self,s):
            self.s = s
a = MyClass('apple')
b = MyClass('banana')
输出都是 banana

通过__new__方法,将类的实例在创建的时候绑定到类属性 _instance上。如果 cls._instanceNone,说明类还未实例化,实例化并将实例绑定到 cls._instance,以后每次实例化的时候都返回第一次实例化创建的实例。

以上是我了解的方法,如果还有其他方法可以告知我,我来加上去

你可能感兴趣的:(python中实现单例模式的几种方法)