python new 和 init

2022-09-23 03:02:12 字數 1352 閱讀 3898

__new__方法:類級別的方法

特性:1.是在類準備將自身例項化時呼叫,並且至少需要傳遞一個引數cls,此引數在例項化時由python直譯器自動提供;

2.始終是類的靜態方法,即使沒有被加上靜態方法裝飾器;

3.必須要有返回值,返回例項化出來的例項;在自己實現__new__()時需要注意:可以return父類(通過super(當前類名,cls)).__new__出來的例項,

或者直接是object的__new__出來的例項

class a(object):

pass

a=a() # 預設呼叫父類object的__new__()方法來構造該類的例項

print (a) # 返回的是<__main__.a object at 0x0000024352732630>

class a(object):

def __new__(cls):

"重寫__new__方法"

return "abc"

a=a()

print (a) # 'abc',例項化物件取決於__new__方法,__new__返回什麼就是什麼

print (type(a)) #

通過__new__()方法實現單例

class singleton(object):

def __new__(cls,*args,**kwargs):

if not hasattr(cls,"_instance"):

cls._instance=super(singleton,cls).__new__(cls)

return cls._instance

a=singleton()

b=singleton()

c=singleton()

print (a)

print (b)

print (c)

輸出結果:

<__main__.singleton object at 0x000002474c92d550>

<__main__.singleton object at 0x000002474c92d550>

<__main__.singleton object at 0x000002474c92d550>

__init__方法:例項級別的方法

特性:1.有一個引數self,該self引數就是__new__()返回的例項;

2.__init__()在__new()的基礎上完成初始化動作,不需要返回值;

3.若__new__()沒有正確返回當前類cls的例項,那__init__()將不會被呼叫

4.建立的每個例項都有自己的屬性,方便類中的例項方法呼叫;

對比下面**理解會更加清晰:

Python init 和 new

init 和 new 區別 1 從傳遞引數角度看, init 第一個引數是例項本身, new 傳遞的是類本身 2 從執行順序角度看, new 方法執行在 init 方法之前 3 從功能角度看, new 是控制物件例項過程,在物件生成之前就執行完畢, init 是用來完成物件的例項化,在物件生成之後給...

new 和 init

1 繼承自 object的新式類 才會有 new 2 new 必須要有一個引數cls 代表當前類 此引數在例項化時由 python直譯器自動...

new 和 init

new 是一個靜態方法 而 init 是一個例項方法 new 方法會返回一個建立的例項 而 init 什麼都不返回 只有在 new 返回一個...