上节介绍了__new__()方法这个比构造方法还重要的方法的语法,本节通过案例来详细剖析__new__()方法的细节以及它与构造方法之间的关系。
一、 案例说明
本节以圆Cir类为例来说明,为了说明问题只定义基本的类信息,只包含一个成员半径radius,两个方法,就是__new__()方法和构造方法__init__()方法。
为了方便查看信息,我们将相关参数及返回值的信息输出。
二、 案例代码
1. 类定义
class Cir():
def __new__(cls,*args,**kwargs):
#看看Python传递给__new__的参数
print("Python传递给__new__的参数:\n***cls: ",cls,"\n***args: ",args,"\n***kwargs:",kwargs)
inst = super().__new__(cls)
print("__new__返回值:",inst)
return inst
def __init__(self,radius):
print("In init,self的值为:",self,", radius的值为:",radius)
self.radius = radius
2. 类实例创建及信息查看(交互模式执行)
c=Cir(10)
c #查看c的数据
Cir #查看类的数据
3. 案例截屏及解读
从上面截图可以看出以下三点:
1) __new__方法在__init__方法前执行;
2) 从上图中红笔标记的地方可以看出,__new__中调用父类__new__方法返回的实例inst与init的self值、以及实例创建后c的值指向地址是同一个,表明三者是一个,并且是由父类__new__方法返回;
3) 从上图中黄色标记部分,可以看到__new__方法的参数cls就是Cir对应的类。
本节通过案例介绍了__new__()方法和__init__方法之间的部分关系,总结如下:
1. __new__方法在__init__方法前执行,__new__方法执行后才返回实例对象,也就是说__new__方法执行前实例并未创建,构造方法中的参数self是__new__方法执行后传递过去的实例;
2. __new__方法的参数是由Python自动传递的,其参数包括创建实例时的“类名”对应类、以及创建创建实例传入的所有参数。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!