举个常见的单例模式例子,我们日常使用的电脑上都有一个回收站,在整个操作系统中,回收站只能有一个实例,整个系统都使用这个唯一的实例,而且回收站自行提供自己的实例。因此回收站是单例模式的应用。
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。
# 实例化一个单例 class Singleton(object): __instance = None def __new__(cls, age, name): #如果类属性__instance的值为None, #那么就创建一个对象,并且赋值为这个对象的引用,保证下次调用这个方法时 #能够知道之前已经创建过对象了,这样就保证了只有1个对象 if not cls.__instance: cls.__instance = object.__new__(cls) return cls.__instance a = Singleton(18, "dongGe") b = Singleton(8, "dongGe") print(id(a)) print(id(b)) a.age = 19 #给a指向的对象添加一个属性 print(b.age)#获取b指向的对象的age属性
运行结果:
In [12]: class Singleton(object): ...: __instance = None ...: ...: def __new__(cls, age, name): ...: if not cls.__instance: ...: cls.__instance = object.__new__(cls) ...: return cls.__instance ...: ...: a = Singleton(18, "dongGe") ...: b = Singleton(8, "dongGe") ...: ...: print(id(a)) ...: print(id(b)) ...: ...: a.age = 19 ...: print(b.age) ...: 4391023224 4391023224 19
# 实例化一个单例 class Singleton(object): __instance = None __is_first = True def __new__(cls, age, name): if not cls.__instance: cls.__instance = object.__new__(cls) return cls.__instance def __init__(self, age, name): if self. __is_first: self.age = age self.name = name Singleton. __is_first = False a = Singleton(18, "习大大") b = Singleton(28, "习大大") print(id(a)) print(id(b)) print(a.age) print(b.age) a.age = 19 print(b.age)
运行结果:
例子1:
# 需求: 设计一个类 返回圆周率 和计算任意两个数求和 # 设计一个类 可以正常的使用类中的方法 而且可以解决内存 # 每次通过这个类创建的对象的地址都是唯一的 # 把这个类 设计成单例类 # 自定义一个工具类 class HMTool(object): # 定义一个类属性 # 判断是否是第一次进入new方法 # 保存子类对象 __instance = None # 重写new方法 def __new__(cls, *args, **kwargs): # 判断new方法是否是第一次执行 # 如果是第一次 我们将委托父类帮我们创建对象 if not cls.__instance: # 调用父类创建子类对象 cls.__instance = object.__new__(cls) # 如果不是 把第一次创建的对象直接返回 return cls.__instance # 返回圆周率 def get_pi(self): return 3.14 # 计算两个数求和 def add2num(self, a, b): return a + b # 通过HMTool t1 = HMTool() print(t1.get_pi()) print(t1) # 通过HMTool t2 = HMTool() print(t2.add2num(10, 20)) print(t2) # 通过HMTool t3 = HMTool() print(t3)
原文:https://www.cnblogs.com/kangwenju/p/12877763.html