day22-单例

1、什么是单例模式
单例模式:基于某种方法实例化多次得到实例是同一个
2、为何用单例模式
当实例化多次得到的对象中存放的属性都一样的情况,应该将多个对象指向同一个内存,即同一个实例
3、如何用
实现单例的方式有3种:
 1 import settings
 2 
 3 class Mysql:
 4     __instacne=None
 5 
 6     def __init__(self,ip,port):
 7         self.ip=ip
 8         self.port=port
 9 
10     @classmethod
11     def from_conf(cls):
12         if cls.__instacne is None:
13             cls.__instacne=cls(settings.IP,settings.PORT)
14         return cls.__instacne
15 obj=Mysql('1.1.1.10',3306)
16 
17 obj1=Mysql.from_conf()
18 obj2=Mysql.from_conf()
19 obj3=Mysql.from_conf()
20 
21 print(obj1)
22 print(obj2)
23 print(obj3)
24 
25 obj4=Mysql('10.10.10.11',3307)
单例模式实现方式一
 1 import settings
 2 def singleton(cls):
 3     cls.__instance=cls(settings.IP,settings.PORT)
 4     def wrapper(*args,**kwargs):
 5         if len(args) == 0 and len(kwargs) == 0:
 6             return cls.__instance
 7         return cls(*args,**kwargs)
 8     return wrapper
 9 
10 @singleton #Mysql=singleton(Mysql) #Mysql=wrapper
11 class Mysql:
12     def __init__(self,ip,port):
13         self.ip=ip
14         self.port=port
15 
16 
17 obj1=Mysql() #wrapper()
18 obj2=Mysql() #wrapper()
19 obj3=Mysql() #wrapper()
20 print(obj1 is obj2 is obj3)
21 print(obj1)
22 print(obj2)
23 print(obj3)
24 obj4=Mysql('1.1.1.4',3308)
25 print(obj4)
单例模式实现方式二
 1 import settings
 2 
 3 class Mymeta(type):
 4     def __init__(self,class_name,class_bases,class_dic): #self=Mysql
 5         super(Mymeta,self).__init__(class_name,class_bases,class_dic )
 6         self.__instance=self.__new__(self) #造出一个Mysql的对象
 7         self.__init__(self.__instance,settings.IP,settings.PORT) #从配置文件中加载配置完成Mysql对象的初始化
 8 
 9         # print(self.__instance)
10         # print(self.__instance.__dict__)
11 
12     def __call__(self, *args, **kwargs): #self=Mysql
13         if len(args) == 0 and len(kwargs) == 0:
14             return self.__instance
15 
16         obj=self.__new__(self)
17         self.__init__(obj,*args,**kwargs)
18         return obj
19 
20 
21 
22 class Mysql(object,metaclass=Mymeta): #Mysql=Mymeta(...)
23     def __init__(self,ip,port):
24         self.ip=ip
25         self.port=port
26 
27 
28 obj1=Mysql()
29 obj2=Mysql()
30 obj3=Mysql()
31 obj4=Mysql('10.10.10.11',3308)
32 
33 print(obj1)
34 print(obj2)
35 print(obj3)
36 print(obj4)
单例模式实现方式三
 

猜你喜欢

转载自www.cnblogs.com/wcl0517/p/9253825.html
今日推荐