python单例模式

单例模式的意思

单例模式是一个软件的设计模式,为了保证一个类,无论调用多少次产生的实例对象,都是指
向同一个内存地址,仅仅只有一个实例(只有一个对象)。

单例模式的优势

1.全局只有一个接入点,可以更好地进行数据同步控制,避免多重占用;
2.由于单例模式要求在全局内只有一个实例,因而可以节省比较多的内存空间;
3.单例可长驻内存,减少系统开销。

单例模式的多种实现方式

基于类方式

class C1:
  __instance = None 
  def __init__(self,name,age):
    self.name = name
    self.age = age
    
  @classmethod
  def singleton(cls):
    if  not cls.__instance:
      # 判断类里面是否有这个属性,没有则创建
      	cls.__instance = cls('moon',18)
    return cls.__instance
      # 有了就返回原本的这个
  
ojb = C1.singleton()
# 产生单例的方法
ojb1 = C1.singleton()

ojb2 = C1('MOON',18)

基于元类

class Mymeta(type):
    def __init__(self,name,bases,dic):
        self.__instance = object.__new__(self)
        self.__init__(self.__instance,'jason',18)
        super().__init__(name,bases,dic)

    def __call__(self, *args, **kwargs):
        if args or kwargs:
            obj = object.__new__(self)
            self.__init__(obj,*args,**kwargs)
            return obj
        return self.__instance
class Mysql(metaclass=Mymeta):
    def __init__(self, name, age):
        self.name = name
        self.age = age

obj1 = Mysql()
obj2 = Mysql()
print(id(obj1), id(obj2))
obj3 = Mysql('tony', 321)
obj4 = Mysql('kevin', 222)
print(id(obj3), id(obj4))

基于模块调用实现单例模式

''' 1, 先在配置文件中 正常的写一个类,由类来产生一个对象 '''

class instance:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def func1(self):
        print('func1')

obj = instance('张无忌',18)

''' 2, 通过模块调用的方法来使用这个对象,这个对象就是单例模式 '''

from XXX import xxx

xxx.obj
xxx.obj.name
xxx.obj.age 

基于装饰器实现单例模式

# 单例装饰器
def Singleton(cls):
    _instance = cls('moon',18) # 这里也可以传变量名  
    # 这里参数的 必须和被装饰类的参数
    def inner(*args,**kwargs):
        if args or kwargs:
            ojb = cls(*args,**kwargs)
            return ojb
        return _instance
    return inner


@Singleton  # Singleton(Mysql)
class Mysql:
    def __init__(self,name,age):
        self.name = name
        self.ahe = age

obj1 = Mysql()
# 如果不传参数 就是默认用的单例,
obj2 = Mysql()
print(id(obj1),id(obj2))

obj2 = Mysql('11','22')
# 如果传参数了 就默认新生一个类

posted @   Python-moon  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示