单例模式实现方式
1、什么是单例模式?
基于某种方法实例化多次得到的实例是同一个;
2、为何用单例模式
当实例化多次得到的对象中存放的属性否一样的情况,应该将多个对象指向同一个内存,即同一个实例
3、怎么用?
(1)单例模式实现方式一,定义类的方法,判断是否实例
# import settings
# class Mysql:
# _isinstance= None #没有实例化
# def __init__(self,ip,port):
# self .ip= ip
# self.port=port
# @classmethod
# def look(cls):
# if cls._isinstance is None : #如果没有实例化 ,进行实例化
# cls ._isinstance =cls(settings.IP,settings .PORT)
# return cls ._isinstance #下次使用直接调用之前实例化的结果
# obj= Mysql.look()
# obj1= Mysql.look()
# obj2= Mysql.look()
#
# print(obj)
# print(obj1)
# print(obj2)
(2)单例模式实现方式二 在类上加装饰器
# import settings
# def auth(func):
# _instance= func(settings.IP,settings.PORT) #从文件中取值给调用者
# def wrapper(*args,**kwargs ):
# if len(args)==0 and len(kwargs )==0: #没有传值
# return _instance #默认从文件中取值给调用者
# return func(*args,**kwargs)
# return wrapper
# @auth #Mysql= auth(Mysql)=wrapper
# class Mysql:
# def __init__(self,ip,port):
# self .ip= ip
# self.port=port
# obj= Mysql()
# obj1= Mysql()
# obj2= Mysql('10.0.0.10',66)
# print(obj)
# print(obj1)
# print(obj2)
(3)单例模式实现方式三 在元类中初始化对象属性
import settings
class Mymate(type):
def __init__(self,class_name,class_pases,class_dic): #定义类
super(Mymate ,self ).__init__(class_name,class_pases,class_dic)
self.sx = self.__new__(self ) #创建空对象,赋值给类的属性,储存
self.__init__(self.sx,settings.IP,settings .PORT) #初始化对象的属性
def __call__(self,*args,**kwargs):
if len(args)==0 and len(kwargs)==0:
return self.sx
obj= self.__new__(self) #创建对象
self.__init__(obj,*args,**kwargs) #初始化对象属性 传入类的对象obj
return obj
class Mysql(object,metaclass=Mymate):
def __init__(self,id,port):
self.id=id
self.port=port
obj= Mysql()
obj1= Mysql()
obj2= Mysql(33,44)
print(obj.__dict__ )
print(obj1.__dict__ )
print(obj2.__dict__ )