今天想跟大家談談有關python中的__new__和__init__的問題,其實這個問題對於我來說還是比較難的,想要徹底弄明白這兩個的區別的確不是一件容易的事情。下面就是我自己的一些簡單的看法。
首先我們要明白一點的是,只有繼承於object的類,或者更準確的說,祖先類是object類才有__new__方法,其他的類沒有這個方法。還有一點需要注意是__new__先於__init__被呼叫,而__new__必須要有返回值,返回的就是__init__的第乙個引數self。
好了,下面我們來看看__new__和__init__到底是個什麼東西。
我們還是通過乙個例子來看看吧。
print(wilson) 執行結果如下:class person(object):
"""wilson person"""
def __new__(cls, name, age):
print ('__new__ is called.')
return super(person, cls).__new__(cls, name, age)
def __init__(self, name, age):
print ('__init__ is called.')
self.name = name
self.age = age
def __str__(self):
return '' % (self.name, self.age)
if __name__ == '__main__':
wilson = person('wilson', 24)
__new__ is called.
__init__ is called.
從上面的例子我們可以看到,__new__方法先於__init__方法被呼叫,我們下面來看看當例項化乙個物件的時候,具體的邏輯順序是怎麼樣的。
wilson = person('wilson', 24)
當我們例項化乙個物件的時候,它的邏輯順序是這樣的:
首先程式會把name和age這兩個引數傳遞給__new__方法,這個方法會返回乙個person類的例項。上面**重寫了__new__方法,這也是該方式通常執行的方式
然後這個例項會通過__init__的第乙個引數self傳入__init__的方法中,然後把引數真正的初始化
所以我們簡單的總結一下,
__init__方法大家應該都比較熟悉了,下面通過乙個經典的例子來看看__new__的作用,它就是利用__new__如何實現單例模式
我們還是先看**
# -*- coding: utf-8 -*-
class singleton(object):
"""docstring for singleton"""
# 利用__new__來實現單例模式
def __new__(cls):
if not hasattr(cls, 'instance'):
cls.instance = super(singleton, cls).__new__(cls)
return cls.instance
# 進行測試,是否實現單例模式
singleon1 = singleton()
singleon2 = singleton()
singleon1.value1 = "wilson"
print(singleon1 is singleon2)
print(singleon2.value1)
通過上面的例子,大家可以看到用__new__實現單例模式的方法,singleon1和singleton2都擁有value1屬性,他們倆個是同乙個例項。
以上就是今天的全部內容
與您共勉
簡談python中的 call
最近在思考 call 和類方法的使用場景,雖然功能會有重疊,但凡存在的必是合理的,肯定會有輕微的不同,看了django以及部分框架的設計原始碼,各有各的設計風格,本著功能邊界的看法,所以做個總結。classa def init self,a,b self.a a self.b b defdo sta...
深圳Python學習 簡談Python的列表排序
python的內建函式sorted 從可迭代物件中的項返回乙個新的排序列表。語法 sorted iterable,key none,reverse false 該函式有兩個可選引數,必須指定為關鍵字引數。key引數指明列表中元素的比較方式,如按字母比較排序 key str.lower key引數的預...
詳解Python中的 init 和 new
一 init 方法是什麼?使用python寫過物件導向的 的同學,可能對 init 方法已經非常熟悉了,init 方法通常用在初始化乙個類例項的時候。例如 複製 如下 coding utf 8 class person object silly person def init self,name,a...