单例设计模式

单例设计模式:

1. 单例设计模式的概念:

​ 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。

2. 单例设计模式常见举例:

​ 电脑上都有一个回收站,在整个操作系统中,回收站只能有一个实例,整个系统都使用这个唯一的实例,而且回收站自行提供自己的实例。因此回收站是单例模式的应用。

3. 单例设计模式的代码:

01.程序没有使用单例模式:
class Person(object):

    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def __repr__(self):
        return f"姓名:{self.name},年龄:{self.age}"
     
if __name__ == "__main__":
	p1 = Person("张三", 18)
	p2 = Person("李四", 19)
	
	# 查看p1和p2的内存地址 
	print("0x%X", id(p1))
    print("0x%X", id(p2))
	

# 运行结果:
# 0x%X 2729821372488
# 0x%X 2729821372768
	
02.使用单例模式:
# 实例化一个单例
class Singleton(object):
	# 申请一个类属性,表示默认类没有实例 相当于一个bool类型的计数器 
	# __isntance和__is_first 是私有属性,只能在类中使用,
	# 类外需要时可以使用语法:实例化对象._类名类私有属性/类私有方法名
    __instance = None 
    
    # 申请一个类属性,表示默认是第一个实例的对象
    __is_first = True
    
	# 编写单例设计模式的版快用  __new__ 魔法方法  
	# 注意:cls和self类似,都指向于实例化对象,
	# 区别是self只能调用类中属性,而cls可以调用类中属性和方法
    def __new__(cls, age, name):
    	#  在类中方法调用类属性的方式:cls.类属性
        if cls.__instance is None:
        # 如果__instance 为空,调用类中魔法方法__new__为对象生成一个地址
            cls.__instance = object.__new__(cls)
        return cls.__instance

    def __init__(self, age, name):
   	    # 在这里要加if判断语句,判断__is_first
        if self. __is_first: # 添加此判断时不会再创建第二个对象 
        #如果没有此条件语句,那么实例化对象s2就会覆盖实例化对象s1
            self.age = age
            self.name = name
            Singleton. __is_first = Fals
            
    # 重写此魔法方法进行输出,
    # 否则输出语句为:print("姓名:{},年龄:{}".format(s1.name,s1.age))
    def __repr__(self):
        return f"姓名:{self.name},年龄:{self.age}"
        
        
if __name__ == '__main__':
    
    s1 = Singleton("张三", 18)
    s2 = Singleton("李四", 19)
    
    # 如果没有重写__new__ 就会默认调用内置的魔法方法__new__,
    # 就会得到两个不同的地址,如果重写了就只是会开辟一个内存空间
    print("0x%X", id(s1))
    print("0x%X", id(s2))
    
    print(s1)
    print(s2)
    # 运行代码:
    # 0x%X 2713571459144
    # 0x%X 2713571459144
    # 姓名:张三,年龄:18
    # 姓名:张三,年龄:18
总结:
  1. 如果没有重写__new__ 就会默认调用内置的魔法方法__new__,
    就会得到两个不同的地址,如果重写了就只是会开辟一个内存空间
    
  2. 如果在__init__中添加 是否为第一个实例化对象的条件语句,实例化第一个对象,先实例化的对象不会被后实例化的对象覆盖;
    否则就会被覆盖,输出的就是第二个实例化的对象
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值