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根本不应该动用他 万一出错了 那么就会对程序造成很大的影响
最好的实现单例模式的方式

  • 所以单例模式最好的实现方式就是你用一个类去创建了一个对象,以后所有的要实现单例模式的地方都去用这个对象去调用执行就可以了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lovely_red_scarf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值