簡述面向物件中__new__和__init__區別
使用Python寫過面向物件的代碼的同學,可能對 __init__ 方法已經非常熟悉了,__init__ 方法通常用在初始化一個類實體的時候,例如:
1 # -*- coding: utf-8 -*-
2
3 class Person(object):
4 """Silly Person"""
5
6 def __init__(self, name, age):
7 self.name = name
8 self.age = age
9
10 def __str__(self):
11 return '<Person: %s(%s)>' % (self.name, self.age)
12
13 if __name__ == '__main__':
14 piglei = Person('piglei', 24)
15 print piglei
這樣便是__init__最普通的用法了,但__init__其實不是實體化一個類的時候第一個被呼叫 的方法,當使用 Persion(name, age) 這樣的運算式來實體化一個類時,最先被呼叫的方法 其實是 __new__ 方法,
__new__方法是什么?
__new__方法接受的引數雖然也是和__init__一樣,但__init__是在類實體創建之后呼叫,而 __new__方法正是創建這個類實體的方法,
1 # -*- coding: utf-8 -*-
2
3 class Person(object):
4 """Silly Person"""
5
6 def __new__(cls, name, age):
7 print '__new__ called.'
8 return super(Person, cls).__new__(cls, name, age)
9
10 def __init__(self, name, age):
11 print '__init__ called.'
12 self.name = name
13 self.age = age
14
15 def __str__(self):
16 return '<Person: %s(%s)>' % (self.name, self.age)
17
18 if __name__ == '__main__':
19 piglei = Person('piglei', 24)
20 print piglei
執行結果 :
1 piglei@macbook-pro:blog$ python new_and_init.py 2 __new__ called. 3 __init__ called. 4 <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__ 通常用于控制生成一個新實體的程序,它是類級別的方法,
本文首發于Python黑洞網,博客園同步跟新
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/181816.html
標籤:Python
下一篇:Python學習筆記(四)字串
