其中,__new__() 不是必须的,只有继承自 object 的类才有。该方法可以返回父类的实例(通过 super(current class name, cls).__new__()),或者直接将对象 _new__ 的 _ 从实例中返回。值得注意的是,在定义子类而不重新定义__new__()时,Python默认调用该类的父类的__new__()方法来构造该类的实例,如果父类没有覆盖__new__(),那么它会一直追溯到object的__new__()方法,因为object是所有new-style类的基类。如果 __new__() 方法在子类中被覆盖,则可以自由选择任何其他新式类。
可以看出,当类中同时出现__new__()和__init__()时,先调用__new__(),再调用__init__()。具体执行流程为:
1. 调用实例对象代码xiaoming = Student('xiaoming',175);
2.传入name和height的参数,执行Student类的__new__()方法,返回该类的一个实例,一般由父类super(Student,cls).__new__(cls)生成, __new__() 实例是 __init__() 的自身;
3. 用实例来调用__init__()方法,进行初始化实例对象的操作。
可以看到,
python中__new__()与__init__()的区别
,
1.首先,用法不同。 __new__() 用于创建实例,因此在创建实例之前调用此方法。它是类级别的方法和静态方法;
而__init__()是用来初始化实例的,所以这个方法是在实例对象创建后调用的。它是一个实例级的方法,用于设置对象属性的一些初始值。
由此可知,__new__()在__init__() 之前被调用。如果__new__() 创建的是当前类的实例,会自动调用__init__()函数,通过return调用的__new__()的参数cls来保证是当前类实例,如果是其他类的类名,那么创建返回的是其他类实例,就不会调用当前类的__init__()函数。
2.其次传入参数不同
__new__() 至少有一个参数cls,代表当前类,实例化时被Python解释器自动识别;
__init__()至少有一个参数self,就是这个__new__()返回的实例,__init__()在__new__()的基础上完成了一些初始化操作。
3.返回值不同
__new__()必须有返回值,返回实例对象;
__init__()不需要返回值。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Python itertools模块:生成迭代器(案例分析)12/10
- ♥ python生成器调用方法抛出异常11/05
- ♥ Python字符串中常用的方法12/14
- ♥ python可以输出中文吗?12/26
- ♥ 查找某个元素是否包含在python列表中12/11
- ♥ 如何在python中清除数组元素10/18
内容反馈