首页 > 编程语言 >python单例模式

python单例模式

时间:2022-11-09 17:24:25浏览次数:43  
标签:__ .__ name python self 模式 单例 age

单例模式的意思

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

单例模式的优势

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')
# 如果传参数了 就默认新生一个类

标签:__,.__,name,python,self,模式,单例,age
From: https://www.cnblogs.com/moongodnnn/p/16874481.html

相关文章

  • 设计模式简介及单例模式
    目录设计模式简介及单例模式单例模块实现的多种方式方式一:绑定给类的方法方式二:基于元类的类名加括号方式三:基于模块的单例模式方式四:定义一个装饰器实现单例模式方法五:基......
  • opencv-python系列一
    简介OpenCVOpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和MacOS操作系统上。它轻量级而且高效,由一系......
  • 单例模式、pickle模块、选课系统
    今日内容概要单列模式实现的多种方式pickle序列化模块选课系统需求分析选课系统架构设计选课系统目录搭建选课系统功能搭建选课系统管理员功能今日内容详细......
  • 设计模式利剑14-迭代器模式
    定     义:它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对对象的内部细节,,Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以......
  • 设计模式利剑17-门面模式
    定     义:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行,门面模式提供一个高层次的接口,使得子系统更易于使用优     点:           ......
  • 设计模式利剑22--享元模式
    定     义:使用共享对象可以有效地支持大量的细粒度的对象,享元模式可以避免大量非常相似类的开销。在程序设计中有时需要生成大量细             粒度的......
  • Python阶段性总结:面向对象之选课系统需求分析及目录搭建
    目录面向对象之选课系统一、选课系统需求分析二、功能提炼三、选课系统架构设计四、选课系统目录搭建五、选课系统功能搭建面向对象之选课系统一、选课系统需求分析1、......
  • 【Python】将方法传递给函数的参数,并在函数中使用该方法
    方法defsum(x,y):returnx+y 函数classdemo:def__init__(self,x,y):self.x=xself.y=ydefrun(self,func)......
  • 多种方法实现单例模式 pickle模块
    目录单例模式类方法@classmethod实现元类实现模块实现装饰器实现双下call、反射实现pickle序列化模块单例模式类方法@classmethod实现classC1:__instance=None......
  • Pythontext_8
    1实例一:创建并打开记录蚂蚁庄园动态的文件2print("\n","="*10,"蚂蚁庄园动态","="*10)3file=open('message.txt','w')#创建或打开保存蚂蚁庄园动态信息......