一:__new__方法
思考:
a. 我们创建实例是通过什么方法创建的呢?
b. 类每次实例化的时候都会创建一个新的对象,如果要求类只能被实例化一次该怎么做呢?===通过单利模式实现 c.什么是单例模式(Singleton Pattern
1、确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式
2、是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场
3、如果instance是None,则创建对象并赋值给instance,如果instance等于之前创建的对象,则直接返回
例1:创建单例典范(保证只有一个对象,只执行一次init方法)
问题:
类每次实例化的时候都会创建一个新的对象,如果要求类只能被实例化一次该怎么做呢?
a:用__new__方法实现单例模式可以当成一个范式记忆
b:节省空间
c:new 方法在实例化的时候最先被执行
步骤:
# 单例模式思路:
# 需要生成一个实例===》通过一个方法创建的===》通过object中的__new__方法生成的实例===>返回地址空间
# 以下写法a与a2就不再是独立的实例
# 每次实例的时候都会开辟一个新的空间
# a=A() # 通过object中的__new__方法生成的实例
# a2=A()
# 需求:这个类只能够我一个人使用怎么办?(这个实例实例化了就不能够再创建实例了)
# 只让__new__创建一个实例,重写====》加个条件===》super
# 条件:第一次实例的时候、保存第一次创建的实例 (创建并保存)
# 不是第一次实例的时候:返回第一次创建的实例地址
class A(object): instance = None # 这个属性要在方法外面 def __init__(self): # 这个方法可以不写,直接写属性就行 name='aa' # cls==》当前类 A # 初始化在__new__方法之后 def __new__(cls, *args, **kwargs): # 重写object类中的new方法 # hasattr(cls,'instance')为True,加个not就是False语句 # if not hasattr(cls,'instance'): # instance是一个随便写的属性 if not cls.instance: # 创建一个实例并把实例地址空间保存到cls.instance中 cls.instance=super().__new__(cls) # new方法来自与object类 # A.instance = super().__new__(A) # cls==A # else: # 不满足就返回 return cls.instance # cls.instance为第一次创建的地址空间 a=A() a.name='小米' print(a.name) # 当第二次创建实例直接返回地址空间==》cls.instance a2=A() print(a2.name) print(id(a)) print(id(a2))
运行截图:
延伸:hasattr 方法
class A(object): name='小明' a=A() # hasattr这个方法是查找有没有这个属性返回bool值,前面放得是类名或者实例,后面是属性变量 print(hasattr(a,'name')) # True print(hasattr(a,'name1')) # False
运行截图:
标签:__,知识点,创建,instance,描述符,实例,new,cls From: https://www.cnblogs.com/xiaogan-520/p/17679196.html