当前位置: 首页 > 科技观察

Python面试高频题:__Init__和__New__的区别

时间:2023-03-20 17:34:38 科技观察

是在Python类内部定义的,以__xx__结尾的方法是类的内置方法,也称为魔术方法。当满足某些条件时,将自动触发该类的内置方法。这里我们着重讲解__init__和__new__,它们与实例创建有关。简要__init____init__(self):这个方法我们比较熟悉。它是python类中默认的初始化方法,即类被实例化时会执行的方法。详细的__new____new__方法重写非常固定,通常如下:def__new__(cls):returnsuper().__new__(cls)其中cls代表类本身。重写__new__方法的代码很固定:重写__new__方法时,必须返回super().__new__(cls),或者返回object.__new__(cls),否则python解释器将得不到已经分配的对象spaceReference,不会调用对象的初始化方法。例如:classMycls:def__new__(cls):print('new')returnsuper().__new__(cls)def__init__(self):print('init')my=Mycls()output:newinit我们可以看到new在init之前输出,证明__new__(cls)在__init__(self)之前执行。我们改写代码:def__new__(cls):print('new')my=Mycls()print(my)output:newNone可以看到,如果__new__(cls):没有返回值,则不会返回任何实例,__init__(self)不会被执行。__new__和__init__总结1.__new__()方法用于创建实例。它会在类被实例化之前首先被调用。它是一个类方法和一个静态方法。__init__()方法用户初始化实例,在创建实例对象后调用。它是实例对象的一个??方法,用于设置类实例对象的一些初始值。2、如果__init__()方法和__new__()方法都出现在类中,则先调用__new__()方法,再调用__init__()方法。__new__()方法是创建实例的第一步。执行后需要返回创建的类的实例,否则会报错,无法执行__init__()方法。其中,__init__()方法不会返回任何信息。有的同学在应用__new__时会问__new__用来实现什么?个人认为单例是最经典的应用之一。单例模式(SingletonPattern)是一种常用的软件设计模式,这种模式的主要目的是保证某个类只有一个实例存在。当我们希望某个类的一个实例在整个系统中只出现时,单例对象就派上用场了。例如,一个系统中可以有多个打印任务,但只能有一个工作任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序列号)生成器。具体实现代码如下:classMycls:_instance=Nonedef__new__(cls):#判断该类的属性是否为空;如果第一个对象还没有创建,我们应该调用父类的方法为第一个对象分配Spaceifcls._instance==None:#将类属性中保存的对象引用返回给python解释器cls._instance=object.__new__(cls)returncls._instance#如果cls._instance不为None,直接返回实例化的实例对象else:returncls._instancedef__init__(self):print('init')my1=Mycls()print(my1)my2=Mycls()print(my2)output:init<__main__.Myclsobjectat0x000000406E471148>Init<__main__.Myclsobjectat0x000000406E471148>可以看到虽然叫my1和my2,但都是0x000000406E471148的对象,是单例模式的应用。