版权声明:所有代码均为自己总结,若有雷同请勿模仿 https://blog.csdn.net/weixin_44253023/article/details/89784579
#__new__方法返回一个对象地址,单例就是让每个对象都返回同一个对象地址
单例的优点:节约内存
单例的第一种写法
class Person
__name=None
def __new__(cls,*args,**kvargs):
if not cls.__name:
cls.__name=object.__new__(cls) #每次返回当前类的对象地址
return cls.__name
p1=Person ()
p2=Person ()
print(id(p1),p(2))
单例的第二种写法
class Person
def __new__(cls,*args,**kvargs):
pass #每次返回None的对象地址
p1=Person ()
p2=Person ()
print(id(p1),p(2))
print(id(None))
这样写单例最为简单,每次都是返回None
单例的第三种写法
class Person
__name=None
def __new__(cls,*args,**kvargs):
if not cls.__name:
cls.__name==object.__new__#每个对象都返回父对象的那个地址
return cls.__name
p1=Person ()
p2=Person ()
print(id(p1),p(2))
#注意第三种写法必须是==,而不能是=,否则不是单例模式
最后要注意的一点就是,使用单例模式对一个对象增加属性,存在那个对象地址中的对象都会增加属性
示例;
p1.age=20
print(p1.age)
print(p2.age)
可以发现p2也增加了age属性。