python的单例模式

python的单例模式一共有四种实现方法

第一种__new__方法


#方法1,实现__new__方法
#因为__new__方法是实例化对象的方法,所以只需要对__new__方法进行限制就可以限制创造出来的对象了
class Singleton(object):
    def __new__(cls, *args, **kw):
        if not hasattr(cls, '_instance'):
            orig = super(Singleton, cls)
            cls._instance = orig.__new__(cls)
        return cls._instance
 
class MyClass(Singleton):
    a = 1
 
one = MyClass()
two = MyClass()
 
two.a = 3
print one.a

2、根据共有属性来创造

#根据类中的共有的属性也是几乎和上面的__new__中
class Bord(object):
    __state = {}
    def __new__(cls, *args, **kwargs):
        ob = super(Bord,cls).__new__(cls)
        ob.__dict__ = cls.__state
        return ob

    def __init__(self,name):
        self.name = name
    def cal(self):
        return self.name
al = Bord("老王")
el = Bord("老李")
print(al.cal())
print(el.cal())


用metaclass实现

  • 何为__metaclass__ ,元类就是用来创建这些类(对象)的,元类就是类的类
class SingLeton(type):
    def __init__(cls,name,bases,dict):
        super(SingLeton,cls).__init__(name,bases,dict)
        cls.___instance = None
    def __call__(cls,*args,**kwargs):
        if cls.___instance is None:
            cls.___instance = super(SingLeton,cls).__call__(*args,**kwargs)
        return cls.___instance

class Myclass(object):
    __metaclass__ = SingLeton # 直接对你的这个类的原类进行修改,改变本身创建对象的规则


A = Myclass()
B = Myclass()


使用装饰器实现单例模式

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

@SingLeton
class MyClass(object):
    a = 1
    def __init__(self,x = 0):
        self.x = x
one = MyClass()
two = MyClass()

*其实我想说 上面四种都是浪费 只是为了让你知道了解有这么四种方式实现的,但是呢实际开发中这四种不会让你去使用的,如果让你使用的公司你就可以考虑换一家了,因为技术真的不咋地,上面四种越是高大上动用底层来实现的 比如metaclass根本不应该动用他 万一出错了 那么就会对程序造成很大的影响
最好的实现单例模式的方式

  • 所以单例模式最好的实现方式就是你用一个类去创建了一个对象,以后所有的要实现单例模式的地方都去用这个对象去调用执行就可以了

你可能感兴趣的:(python的单例模式)