单例简介
单例是一种开发模式。
单例指单个对象。
对象地址空间
cat singleton.py
#!/usr/bin/env python3
#coding:utf8
class Student:
pass
s=Student()
s1=Student()
print(s)
print(s1)
可以看到这两个对象的地址是不一样的,内存为每个对象分配一个独立的空间。使用单例模式可以让对象使用一个内存地址空间。
[root@ceph01 python]# python singleton.py
<__main__.Student instance at 0x7fe52003a200>
<__main__.Student instance at 0x7fe52003a1b8>
真正为对象开辟内存由
return object.init()决定,通过阻止这个操作,可以让新对象不开辟新的地址。
单例实现
cat singleton.py
#!/usr/bin/env python3
#coding:utf8
class Singleton:
#私有化
__instance = None
#帮类开辟空间的函数是__new__
#重写父类,修改__new__方法
#cls指当前类
def __new__(cls):
print('------>__new__')
if cls.__instance is None:
cls.__instance = object.__new__(cls)
return cls.__instance
else:
return cls.__instance
s=Singleton()
s1=Singleton()
print(s)
print(s1)
python3 singleton.py
------>__new__
------>__new__
<__main__.Singleton object at 0x7fd5028bc0b8>
<__main__.Singleton object at 0x7fd5028bc0b8>
cat singleton.py
#!/usr/bin/env python3
#coding:utf8
class Singleton:
#私有化
__instance = None
#帮类开辟空间的函数是__new__
#重写父类,修改__new__方法
#cls指当前类
def __new__(cls):
print('------>__new__')
if cls.__instance is None:
print("进到了if")
cls.__instance = object.__new__(cls)
return cls.__instance
else:
print("进到了else")
return cls.__instance
s=Singleton()
s1=Singleton()
s2=Singleton()
print(s)
print(s1)
print(s2)
python3 singleton.py
------>__new__
进到了if
------>__new__
进到了else
------>__new__
进到了else
<__main__.Singleton object at 0x7f9053724048>
<__main__.Singleton object at 0x7f9053724048>
<__main__.Singleton object at 0x7f9053724048>
简化下
cat singleton.py
#!/usr/bin/env python3
#coding:utf8
class Singleton:
#私有化
__instance = None
#帮类开辟空间的函数是__new__
#重写父类,修改__new__方法
#cls指当前类
def __new__(cls):
print('------>__new__')
if cls.__instance is None:
cls.__instance = object.__new__(cls)
return cls.__instance
s=Singleton()
s1=Singleton()
s2=Singleton()
print(s)
print(s1)
print(s2)
python3 singleton.py
------>__new__
------>__new__
------>__new__
<__main__.Singleton object at 0x7f4fbac260b8>
<__main__.Singleton object at 0x7f4fbac260b8>
<__main__.Singleton object at 0x7f4fbac260b8>