仍旧是对Burgess Zheng做些修改,这个作者CSDN有他,也附上了链接。
# 实现__new__方法
# _instance是一个属性,这个属性是一个对象。
# 如果cls._instance不存在,说明该类还没有实例化过,利用super().__new(cls)
#实例化该类,并返回一个self对象
# 如果cls._instance属性值存在,直接返回cls._instance,并且这个对象 就是 init方法里面的self
__author__ = "Burgess Zheng"
#!/usr/bin/env python
#-*- coding:utf-8 -*-
'''
Singleton
'''
# 实现__new__方法
# 并在将一个类的实例绑定到类变量_instance上,
# 如果cls._instance为None说明该类还没有实例化过,实例化该类,并返回
# 如果cls._instance不为None,直接返回cls._instance
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super().__new__(cls)
# if hasattr(cls, '_instance'):
# pass
# else :
# cls._instance = super().__new__(cls)
# return cls._instance # 这一块注释的代码块是第二种容易懂的方法
return cls._instance#这个不能忘记遗漏
class MyClass(Singleton):
def __init__(self, name):
self.name = name
class Nana(Singleton):
def __init__(self, name):
self.name = name
a = MyClass("Burgess")
print(a.name)
b = MyClass("Crystal")
print(a.name)
print(b.name)
print(id(a.name))
print(id(b.name))
print('------共用一个内存地址---------')
b.name = 'xx'
print(a.name)
print(b.name)
print('一个类永远只允许一个实例化对象,不管多少个进行实例化,都返回第一个实例化的对象')
print(id(a.name))
print(id(b.name))
使用这个代码烦请留意以下:
1)hasattr函数用法,这个参考的菜鸟教程
2)__new__特殊方法的使用,这个我是参考的Python __new__()方法详解,各位可以借鉴。我发现单例实现CSDN还有多种生成方法:python cls.instance_Python单例模式的四种方法_吴山夜雨的博客-CSDN博客
需要的人可以参考,我个人觉得Python __new__()方法详解 这个对于我这个新手更容易理解,更多繁杂的我就不去研究了。
最后,还是感谢爱人为了让我这个新手理解设计模式,不断自己先理解,然后再给我揉碎讲。也感谢各位前辈无私的开源精神,我会谨记,谢谢!