Python学习之路(4)——init和new方法

1、什么是__init__方法?
Python面向对象编程过程中,可能对类的__init__方法已经非常熟悉了,__init__方法通常用在初始化一个类实例的时候。

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __str__(self):
        return '<Person: %s(%s)>' % (self.name, self.age)

if __name__ == '__main__':
    nicolas = Person('nicolas', 999)
    print(nicolas)

上述例子是__init__方法的最普通的用法。但是实际上__init__方法不是实例化一个类时第一个被调用的方法。当使用Person(name, age)来实例化一个类时,最先被调用的方法其实是__new__方法。

 

2、什么是__new__方法?

__init__方法是在类实例化之后调用,__new__方法则是创建这个类实例的方法。

class Person(object):
    def __new__(cls, name, age):
        print('__new__ called.')
        return object.__new__(cls)

    def __init__(self, name, age):
        print('__init__ called.')
        self.name = name
        self.age = age

    def __str__(self):
        return '<Person: %s(%s)>' % (self.name, self.age)

if __name__ == '__main__':
    nicolas = Person('nicolas', 999)
    print(nicolas)

执行结果如下:

__new__ called.
__init__ called.
<Person: nicolas(999)>

通过运行这段代码,可以看出,__new__方法的调用确实是发生在__init__方法之前。

其实当实例化一个类的时候,具体的执行逻辑是这样的:

p = Person(name, age) 
1.创建p这个名字

2.首先执行使用name和age参数来执行Person类的__new__方法,这个__new__方法会返回Person类的一个实例

3.将__new__返回的类实例赋值给p

4.然后利用这个实例来调用类的__init__方法(__init__里面的的self这个参数,就是__new__方法产生的实例)

所以,__init__和__new__最主要的区别在于: 

1.__init__通常用于初始化一个新实例,控制这个初始化的过程,比如添加属性, 做一些额外的操作,在类实例被创建完以后调用。它是实例级别的方法。 

2.__new __常用于控制生成一个新实例的过程。它是类级别的方法。 

 

posted on 2018-02-23 17:50  nicolas_Z  阅读(178)  评论(0)    收藏  举报

导航