调用同一个类中的其他方法_Python 常用内建方法:__new__()与__init__()使用详解

1339fdaea943e381685edbbdaaa1e744.png

构造方法包括创建、初始化对象,在Python当中,先执行__new__方法,然后执行__init__方法,从官方文档可以看到:

  • __new__是在实例对象创建之前被调用的,会返回当前对象的一个实例,因为它的任务就是创建实例然后返回该实例,是静态方法。
  • __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,无返回值。

也就是说,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数self,然后__init__在__new__的基础上上完成一些初始化的操作,如给这个实例设置一些参数,__init__不需要返回值,如下实例代码:

c80a0bd21050690181fa905bb9543256.png

通过如下执行结果可以看出,TestOps类中__new__在__init__之前被调用,__new__的返回值(实例对象)与__init__方法的第一个参数self为同一个对象,然后__init__在__new__的基础上上完成一些初始化的操作,如 self.time = time.time(),同时__init__不需要返回值。

8a3b804d6480f89067807b45c82c6e34.png

如果__new__创建的是当前类的实例(__new__(cls),通过cls来保证是当前类实例),会自动调用__init__函数。如果__new__创建的不是当前类的实例,就不会调用当前类的__init__函数,也不会调用其他类的__init__函数,如下实例代码:

7043a3cd22269680b61b5394ee51b414.png

可以看到当TestOps中__new__创建的不是当前类的实例,而是Other的实例时,没有调用当前类TestOps的__init__函数,也没有调用Other类的__init__函数,同时执行的common实例方法来自Other类,并不是当前TestOps类。

4eeb8d42dbdd091ef8e2dac268e8ba3c.png

总结

  • __new__方法是定义在元类type里面的,用于创建实例,并将实例传给__init__函数。因此__new__必须具有返回值,__init__函数依赖该返回,否则无法创建对象。
  • __new__的本质上是类方法,故以cls为第一个参数,但是因为系统知道它是类方法,因此不需要显式添加@classmethod
  • 自己在定义__new__的时候,__new__的参数要与__init__函数的参数对应匹配,或者可以使用*arg和**args的形式,代码示例如下:
2d5d548839b366731e8b8e56e128eef9.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值