Python的__new__方法和__init__方法

Python的__new__方法和__init__方法

定义的理解

** new(cls,[,…])** 方法在实例创建之前被调用,主要负责创建实例并返回该实例,它的第一个参数就是所需要创建的实例所属的类,然后返回所创建的实例。
**init(self,[,…])**方法则是在__new__方法实例化对象以后调用对对象进行初始化操作,它的第一个参数即是__new__方法返回的实例。

区别

  1. __new__方法是创建实例,__init__方法是初始化实例
  2. __new__方法是类级别的方法,__init__方法是实例级别的方法
  3. __new__方法必须返回一个实例,__init__方法不能有返回值
  4. 调用时间不同,__init__方法是在__new__方法被调用创建实例之后才被调用的
    在这里插入图片描述
    我们在重写的__new__方法和 __init__方法中分别加入打印,运行后创建对象可以看出先调用的是__new__方法、然后调用的是__init__方法。
    在这里插入图片描述

一些说明

  1. __new__方法中的第一个参数cls代表的是当前类,此参数在实例化时由python解释器自动识别,该参数也可用其他名称,比如cl、clss,一样可以使用。
  2. 同理,__init_方法中的第一个参数self代表的是当前实例,此参数在实例化时由python解释器自动识别,该参数也可用其他名称,比如se、sel,一样可以使用。
    在这里插入图片描述
    下图可以看到,也是可以正常创建实例和使用:
    在这里插入图片描述
  3. 重写的__new__方法一般是调用父类的__new__方法去创建一个当前子类的实例对象,关键在于向父类的__new__方法中传入表示当前类的参数cls,创建完成后会调用当前子类的__init__方法进行初始化。
    在这里插入图片描述
    当然,如果在重写的__new__方法中返回其他类的实例,在创建实例后既不会调用当前类的__init__方法,也不会调用其他类的__init__方法。 在这里插入图片描述
    根据上面的代码,在实例化时重写的__new__方法会返回一个Stri类的实例。 在这里插入图片描述
    可以看到并没有执行,Capstr类的__init__方法,也没有执行Stri类的__init__方法,查看实例c的类型可以看到属于Stri类。
  4. 重写的__new__方法要和重写的__init__方法在参数上,除了第一个参数外要保持一致,即重写的__new__方法中的添加的参数也会也会原封不动的传给__init__方法。
    在这里插入图片描述
    生成实例后,可以看到打印的string是创建实例时给入的字符串 在这里插入图片描述

重写__new__的作用

__new__的重写主要是为了当继承了不可修改类(str,int,tuple等等)时,可以通过此方式重新定义对象的创建过程。我们在上面的例子中基本都是继承了str这个不可修改的类,通过重写__new__方法实现了创建对象时将其小写字母全部转为大写(该示例参考的是鱼C相关课程)。
在这里插入图片描述
参考资料:
Python 中的__new__和__init__的区别
【Python教程】《零基础入门学习Python》(小甲鱼)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值