1. 程式人生 > >__init__和__new__解釋

__init__和__new__解釋

__new__ cls pan self. 解釋 第一個 person self 級別

__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__解釋