深入探究Python类系列之三:__init__(),__new__(),__call__()的区别

1.__new__()方法

这是一个类方法,其作用是创建所属类的一个实例对象。即我们在使用:

                                                                实例对象名 = 类名()

创建实例对象时,类首先会调用该方法创建一个实例对象。除非特殊情况,一般不要重写__new__()方法。

2.__init__()方法

这是一个实例方法,其作用在于对__new__()方法创建的实例对象进行初始化,一般在该方法中完成实例属性的赋值操作。

在Python创建类的实例对象时,其创建过程是类对象首先会调用__new__()方法创建一个实例对象并将初始化所需的数据传递给它,然后该实例对象调用自己的__init__()方法,并利用类对象传递过来的数据完成初始化。这样,就完成了创建实例对象的全部过程。

3.__call__()方法

这也是一个实例方法,当实例对象被调用时会执行该方法,注意这里是实例对象被调用时才会执行该方法,而类对象被调用时不会(类对象被调用的结果就是创建一个实例对象),请仔细辨别其中的区别。

在Python中,所谓的调用,就是在对象后加上一个括号(如果有参数则需要传入参数)。如,我们创建了一个手机类名为Phone,那么对手机类的调用会得到一个手机类的实例对象,我们将它命名为my_phone,即:my_phone=Phone(),而这个过程就会调用__new__()方法和__init__()方法。如果我们再对实例对象my_phone进行调用,即my_phone(),则会调用__call__()方法

你可能觉得__call__()似乎没有什么作用,其实不然,Python中用类实现的装饰器主要就是利用了__call__()方法,这一点我后面会进行详细讲解。

图解__init__()、__new__()、__call__()的原理和区别

你可能感兴趣的:(深入探究Python类系列之三:__init__(),__new__(),__call__()的区别)