#单例:一个类只能生成一个实例
单例的本质:一个类最多生成一个实例
__new__:
1 真正生成实例的方法
2 在这个方法里,要判断是否存在_instance的类变量
如果已经存在了,直接返回
不在呢?那么我给_instance赋值一个新生成的实例对象。
class Singleton(object):
    def __new__(cls, *args, **kw):
        if not hasattr(cls, '_instance'):
            print(cls)
            #orig = super(Singleton, cls)
            cls._instance = object.__new__(cls, *args, **kw)
        return cls._instance
 
s1=Singleton()#第一次生成实例,走if语句成立,调用__new__生成一个实例,后返回
s2=Singleton()#第二次生成实例,if语句不成立不会再走下面的的语句,直接返回cls._instance(第一次生成的实例),以此来实现单例
print(s1==s2)
print(id(s1))
print(id(s2))
C:\Users\dell\Desktop\练习\6>py -3 0610.py
<class '__main__.Singleton'>
True
1526180159560
1526180159560
 
#继承之后实现单例
class Singleton(object):
    def __new__(cls, *args, **kw):
        if not hasattr(cls, '_instance'):
            print(cls)
            #orig = super(Singleton, cls)
            cls._instance = object.__new__(cls, *args, **kw)
        return cls._instance
 
class MyClass(Singleton):pass
 
s1=MyClass()
s2=MyClass()
 
 
print(s1==s2)
print(id(s1))
print(id(s2))
C:\Users\dell\Desktop\练习\6>py -3 0610.py
<class '__main__.MyClass'>
True
1734367708776
1734367708776
 
 
#另一种方式实现单例,导入法:
a.py
class My_Singleton(object):
    def foo(self):
        pass
my_singleton = My_Singleton()

 

bb.py
import a
 
print(id(a.my_singleton))
print(id(a.my_singleton))
print(id(a.my_singleton))
C:\Users\dell\Desktop\练习\6>py -3 bb.py
1827500073704
1827500073704
1827500073704
 
 
https://www.cnblogs.com/LLWH134/p/10373157.html
1. 单例模式 --> 单一(唯一)的实例. 在整个运行时间内, 内存中只有一个对象, 一般该对象涉及网络,资源等操作.
2. 单例模式一般分为懒汉式和饿汉式 懒汉式内存占用更加合理
posted on 2019-10-28 15:51  腿短毛不多  阅读(143)  评论(0编辑  收藏  举报