[强基06] _ _ new _ _和__init__ magic methods的调用顺序和使用规则
调用顺序:
类中__new__方法的执行优先级高于__init__方法。当类体代码运行时,首先执行__new__方法的函数体代码,然后执行__init__方法的函数体代码。
使用规则:
__init__方法,主要用于设置类的初始化参数。
__new__方法,主要用于通过类实例化来干预生成对象的过程,从而达到一定的目的;
示例:单一模式
了解流行的单一示例,即无论一个类被调用多少次,只能创建一个实例对象。
(每次实例化一个类,它都会创建一个新的对象。如果要求类只能实例化一次,也就是说,即使多次调用,它仍然使用同一个对象,这需要通过singleton模式来设置。)
在下面写一个单例模式来控制对象的创建。无论类被调用多少次,都使用同一个对象。
#单一模式
我的班级:
_ _实例=无
def __new__(cls,*args,**kwargs):
#确定该类是否创建了对象。
如果cls。__instance:
打印(满足条件,以前创建的对象,直接返回以前创建的对象)
返回cls。_ _实例
else:
打印(该类以前没有创建过对象)
#开始创建对象
obj=super()。__新__(cls)
#将__instance的值修改为创建的对象。
cls。_ _实例=obj
#返回对象
返回对象
m1=Myclass()
m2=Myclass()
m3=Myclass()
打印(m1、m2、m3)
打印(id(m1)、id(m2)、id(m3))
''打印结果如下:
类以前从未创建过对象。
如果满足条件,先前创建的对象将直接返回到先前创建的对象。
如果满足条件,先前创建的对象将直接返回到先前创建的对象。
__main__。B240 __main__处的Myclass对象。B240 __main__处的Myclass对象。B240处的Myclass对象
43168320 43168320 43168320
'''
#单一模式简化代码
#思维安排:
#如果变量__instance没有值,则创建一个对象并分配它以保存它;
#如果变量__instance有值,将直接返回之前保存的对象;
我的班级1:
_ _实例=无
def __new__(cls,*args,**kwargs):
如果不是cls。__instance:
obj=super()。__新__(cls)
cls。_ _实例=obj
返回cls。_ _实例
m1=Myclass1()
m2=Myclass1()
m3=Myclass1()
打印(m1、m2、m3)
打印(id(m1)、id(m2)、id(m3))
''打印结果如下:
B128处的_ _ main _ _ _ . myclass 1对象B128处的_ _ main _ _ _ . myclass 1对象B128处的_ _ myclass 1对象
43168040 43168040 43168040
'''
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/149515.html