单例模式的意思
单例模式是一个软件的设计模式,为了保证一个类,无论调用多少次产生的实例对象,都是指
向同一个内存地址,仅仅只有一个实例(只有一个对象)。
单例模式的优势
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