什么是单例模式?
单例模式是指类生成对象时,只能生成一个实例,其实这里的只能生成一个实例指的是只会分配一个
内存地址用于此类的实例生成,所有实例化的对象,最终都是返回的改地址所指向的对象。
我们来看一个单例的例子:
class Students: __singleStudent = None def __init__(self, name, age): super().__init__() self.name = name self.age = age def __new__(cls, name, age): if cls.__singleStudent is None: cls.__singleStudent = object.__new__(cls) return cls.__singleStudent
知识点:
1、python实例化的过程是先调用__new__()方法,生成一个对象并分配内存地址。然后再调用__init__()方法进行实例初始化
2、单例中,会有一个私有类变量,用于存放该类的实例。
3、__new__()方法先判断私有类变量是否为空,为空则调用object类的__new__()方法来生成一个对象(其实是重写父类__new__()方法并调用父类的该方法
其中object.__new__(cls)的cls指的就是当前所在类本身),所以生成的是当前类的对象并返回。
4、然后调用当前类中的__init__()方法,并传入参数(__new__()接收的参数用于其__init__()初始化时使用).
s1 = Students("tom", 18) print(s1, s1.name, s1.age) s2 = Students("jerry", 20) print(s1, s1.name, s1.age) print(s2, s2.name, s2.age)
我们先实例化一个对象s1,然后查看s1对象和其属性name、age
然后再实例化一个对象s2,然后查看s2的对象和属性name、age
回过头看s1
执行结果:
D:\python\python.exe E:/practicemore/fff.py <__main__.Students object at 0x000002B0583732E0> tom 18 <__main__.Students object at 0x000002B0583732E0> jerry 20 <__main__.Students object at 0x000002B0583732E0> jerry 20
我们可以看到,如论怎样实例化对象,都是相同的对象(相同的对象地址),再次实例化的属性会将旧的替换。这样就达到了至始至终只有一个实例的效果,
多次实例化改变的只是对象的属性。
原文:https://www.cnblogs.com/ctltest/p/14651064.html