簡談Python中的 new 和 init

2021-08-15 09:38:53 字數 1931 閱讀 9757

今天想跟大家談談有關python中的__new__和__init__的問題,其實這個問題對於我來說還是比較難的,想要徹底弄明白這兩個的區別的確不是一件容易的事情。下面就是我自己的一些簡單的看法。

首先我們要明白一點的是,只有繼承於object的類,或者更準確的說,祖先類是object類才有__new__方法,其他的類沒有這個方法。還有一點需要注意是__new__先於__init__被呼叫,而__new__必須要有返回值,返回的就是__init__的第乙個引數self。

好了,下面我們來看看__new__和__init__到底是個什麼東西。

我們還是通過乙個例子來看看吧。

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)

print(wilson)

執行結果如下:

__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...