#单例:一个类只能生成一个实例
单例的本质:一个类最多生成一个实例
__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:UsersdellDesktop练习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:UsersdellDesktop练习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:UsersdellDesktop练习6>py -3 bb.py
1827500073704
1827500073704
1827500073704
1. 单例模式 --> 单一(唯一)的实例. 在整个运行时间内, 内存中只有一个对象, 一般该对象涉及网络,资源等操作.
2. 单例模式一般分为懒汉式和饿汉式 懒汉式内存占用更加合理