单例设计模式的练习
来源:互联网 发布: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
- 单例设计模式的练习
- 设计模式练习:单例模式
- 设计模式练习--单例模式
- 【设计模式练习】单例构造
- 单例模式的设计
- 单例模式的设计
- 单例的设计模式
- 设计模式 单例模式 优雅的单例模式
- Unity的设计模式--单例模式,
- 简单的设计模式-单例模式
- java的设计模式---单例模式
- 设计模式的学习-单例模式
- 常用的设计模式----单例模式
- java的设计模式---单例模式
- Android的设计模式-单例模式
- java的设计模式--单例模式
- 设计模式--单例设计模式的思考
- Android设计模式之单例设计模式的优缺点
- 【ZOJ3951 The 17th Zhejiang University Programming Contest D】【树形DP 合并思想 复杂度计算】Independent Set 构造树使得不同
- Ajax传递json数据
- 经典查找算法
- JAVA实现特定范围的完数输出
- 一些感悟
- 单例设计模式的练习
- stm32f103串口1串口2收发程序
- 获取图像像素方法汇总
- strurts2总结
- vim 保存utf-8文件为gbk
- Mybatis结果集自动映射
- uva536 -- Tree Recovery
- js运动功能的封装
- 线性图形混合