zoukankan      html  css  js  c++  java
  • 单态模式

    # ### 单态模式 
    '''无论实例化多少次,都有且只有一个对象.'''
    '''最终目的:为了节省内存空间.应用的场景是只调用相关的成员属性或方法,而不用动态添加成员属性方法的环境中'''
    
    """
    __obj 变成私有,控制不让用户在类外直接获取obj,而是用__new__来控制返回的逻辑
    先判断cls.__obj 是不是None
    如果是None,代表是一个空的对象,那么就利用父类的__new__方法来创建对象
    如果不是一个空对象,代表先前早已实例化过了一个对象
    就把这个对象给他返回
    """
    # (1) 基本用法
    class Singleton():
    	__obj = None
    	def __new__(cls):
    		if cls.__obj is None:
    			# 借助父类创建对象
    			obj = object.__new__(cls)
    			# 把这个对象赋值给类中成员属性__obj
    			cls.__obj = obj
    		return cls.__obj
    
    # 第一次创建时,因为cls.__obj 是None 所以创建一个对象
    obj = Singleton()
    print(obj)
    # 第二次实例化时,因为cls.__obj 不是None ,直接返回上一次创建的那个对象
    obj = Singleton()
    print(obj)
    # 第三次实例化时,同第二次
    obj = Singleton()
    print(obj)
    obj = Singleton()
    print(obj)
    obj = Singleton()
    print(obj)
    
    # (2) 改造
    class Singleton():
    	__obj = None
    	def __new__(cls,*args,**kwargs):
    		if cls.__obj is None:
    			cls.__obj = object.__new__(cls)
    		return cls.__obj 
    		
    	def __init__(self,name):
    		self.name = name
    		
    obj1 = Singleton("王波")
    
    obj2 = Singleton("方真强")
    print(obj1.name)
    print(obj2.name)
    
    
    """
    第一次是创建对象,并且通过init初始化对象,为该对象赋值成员属性name
    self.name = 王波
    
    第二次是直接返回上一个对象,然后对他进行初始化,为该对象赋值成员属性name
    self.name = 方真强
    
    两个不同的变量名指向的是同一个对象
    而此时该对象的成员属性name 这个值是方真强
    print(obj1.name)
    print(obj2.name)
    打印的都是方真强
    """
    

      

  • 相关阅读:
    bash 常用操作
    阿里云专有网络与弹性公网IP
    Excel 中 Index 和 Match 方法的使用
    分割excel sheet
    vba 工作案例-sheet间拷贝内容
    趣味题:重男轻女的村庄
    vba 工作案例1
    wordpress 导航相关的函数
    怎么样打印加密PDF文件
    excel 2013 图表制作
  • 原文地址:https://www.cnblogs.com/huangjiangyong/p/10920634.html
Copyright © 2011-2022 走看看