单例设计模式的练习

来源:互联网 发布:c语言对数函数怎么表示 编辑:程序博客网 时间:2024/05/22 03:27

单例设计模式

有关的知识点

class A(object):    def __init__(self):        print("这是 init 方法")    def __new__(cls):        print("这是 new 方法")        return object.__new__(cls)  #返回的是一个实例了的对象  就是self__new__至少要有一个参数cls,代表要实例化的类(一般就是本类),此参数在实例化时由Python解释器自动提供__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例(父类没有自己实现的话还是会去找基类的),或者直接是object的__new__出来的实例__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
# 实例化一个单例class Singleton(object):    __instance = None  # 私有类的属性(就是私有了一个类的对象)    def __new__(cls, age, name):  # 这个方法会返回一个对象  就是self对象        # 如果类属性中是否指向了一个对象  如果没有        # 那么就创建一个对象,并且赋值为这个对象的引用,保证下次调用这个方法时        # 能够知道之前已经创建过对象了,这样就保证了只有1个对象        if not cls.__instance:  # 判断类的属性是否存在            cls.__instance = object.__new__(cls)  # 不能存在就创建一个类的是实例对象        return cls.__instance  # 返回类的实例对象

保证单例的设计模式只能初始化一次

如果只是简简单单的完成了类的单例 那么当去创建一个对象并调用init(self) 方法的时候 当创建多个对象 并初始化多次的时候 最后初始化的属性
会覆盖前面初始化过的属性,为了防止多次的初始化 我们可以在初始化中在加一层判断

class Demo:    __instance=None # 用于单例创建时对象的赋值和引用    __flag=False  # 用于控制初始化时的判断    def __new__(cls,*args):        if not cls.__instance:  # 判断对象是否存在            cls.__instance=object.__new__(cls)  # 把创建的对象赋值给 类的属性        return cls.__instance  # 返回创建的对象    def __init__(self,name):        if not Demo.__falg:  # 判断标志位            self.name=name  # 初始化对象的属性值            Demo.__falg=True  # 设置标志位  这样当下次再创建对象的时候就不会在进行初始化操作了demo=Demo("haha")print(id(demo))  # 打印对象的内存地址  print(demo.name) # 打印属性# 创建对象2denmo2=Demo("hehe")print(id(demo2))  # 打印对象的内存地址print(demo2.name)  # 打印属性结果:139798882285720haha139798882285720haha
0 0