码迷,mamicode.com
首页 > 其他好文 > 详细

__init__和__new__解释

时间:2017-08-14 01:31:51      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:self   解释   用法   __new__   是什么   常用   区别   代码   init   

__init__ 方法通常用在初始化一个类实例的时候使用,但是他并不是初始化类时第一个被调用的方法,第一个被调动的方法是__new__方法。

# -*- coding: utf-8 -*-
 
class Person(object):
    """Silly Person"""
 
    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__:
    piglei = Person(piglei, 24)
    print piglei

__new__方法接受的参数虽然也是和__init__一样,但__init__是在类实例创建之后调用,而 __new__方法正是创建这个类实例的方法。

# -*- coding: utf-8 -*-
 
class Person(object):
    """Silly Person"""
 
    def __new__(cls, name, age):
        print __new__ called.
        return super(Person, cls).__new__(cls, name, age)
 
    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__:
    piglei = Person(piglei, 24)
    print piglei

执行结果:

piglei@macbook-pro:blog$ python new_and_init.py
__new__ called.
__init__ called.
<Person: piglei(24)>

通过运行这段代码,我们可以看到,__new__方法的调用是发生在__init__之前的。其实当 你实例化一个类的时候,具体的执行逻辑是这样的:

1.p = Person(name, age)
2.首先执行使用name和age参数来执行Person类的__new__方法,这个__new__方法会 返回Person类的一个实例(通常情况下是使用 super(Persion, cls).__new__(cls, … …) 这样的方式),
3.然后利用这个实例来调用类的__init__方法,上一步里面__new__产生的实例也就是 __init__里面的的 self
所以,__init__ 和 __new__ 最主要的区别在于:
1.__init__ 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。
2.__new__ 通常用于控制生成一个新实例的过程。它是类级别的方法
但是说了这么多,__new__最通常的用法是什么呢,我们什么时候需要__new__?

http://python.jobbole.com/86506/

__init__和__new__解释

标签:self   解释   用法   __new__   是什么   常用   区别   代码   init   

原文地址:http://www.cnblogs.com/suiyisuixing/p/7355596.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!