Python之派生內建不可變型別並修改其實例化行為

2021-10-07 13:18:12 字數 2389 閱讀 9652

__new__方法是建立物件的方法

• 此處重寫了父類的方法

• 需呼叫父類的__new__方法建立物件

• 需將物件返回出來給__init__方法

class

demo

(object):

def__new__

(cls,

*args,

**kwargs)

:#重寫父類方法

print

("new"

)#new

print

(object

.__new__(cls)

)#<__main__.demo object at 0x0000000002ca3e80>

return

object

.__new__(cls)

#呼叫父類__new__方法建立物件,並將建立的物件返回給__init__方法

def__init__

(self)

:# print(self)

print

("init"

)

d = demo.__new__(demo)

返回結果如下:

new<main.demo object at 0x0000000002ca3e80>

__init__方法為初始化方法

• 注意:當建立完物件時,自動呼叫它

如下例項1,當我們重寫了__new__方法,並返回建立的物件給__init__方法時,我們發現__init__方法被自動呼叫了:

class

demo

(object):

def__new__

(cls,

*args,

**kwargs)

:print

("new"

)return

object

.__new__(cls)

def__init__

(self)

:print

("init"

)

d = demo(

)

如下例項,當我們重寫了__new__方法,但並沒有返回物件給__init__方法時,我們發現__init__方法並沒有被呼叫:

class

demo

(object):

def__new__

(cls,

*args,

**kwargs)

:print

("new"

)# return object.__new__(cls)

def__init__

(self)

:print

("init"

)

d = demo(

)

執行結果如下:

new如下例項,當我們沒有重寫了__new__方法,我們會發現會繼承父類的__new__,並返回建立物件給__init__方法時,__init__方法被自動呼叫了:

class

demo

(object):

def__init__

(self)

:print

("init"

)

d = demo(

)

執行結果如下:

init

如下例項,實現如下需求:

class

inttuple

(tuple):

def__new__

(cls,iterable)

:#重寫__new__方法

f =[ i for i in iterable if

isinstance

(i,int

)and i >0]

#使用列表推導式求出int型別並大於0的物件

print

(super()

.__new__(cls,f)

,"hello"

)return

super()

.__new__(cls,f)

#返回元組

int_tuple = inttuple([2

,6,[

"x",

"y",-10

],-12

,30,4

])print

(int_tuple)

輸出結果如下:

(2, 6, 30, 4) hello

(2, 6, 30, 4)

python如何派生內建不可變型別並修改例項化行為

案例 我們想要自定義新類www.cppcns.com型的元組,對傳入的可迭代物件我們只保留其中的int型別並且值大於0的元素,如下 1,2,7,1,oo 9 1,7,9 如何實現?1 自定義乙個類,繼承tuple類 2 重寫 new 類方法,new方法是對引數進行例項操作,在此之間,對例項引數進行預...

python可變與不可變

可變與不可變型別的實質實際上就是儲存機制的不同 不可變型別 比如字串 被稱為不可變的字串行,每個字元底層均有規範的unicode碼對應,記憶體規定無法對單一的乙個字元進行修改,要修改字串必須重新指向乙個全新的字串 可變型別 一方面,該列表可以保證在位址不變的前提下,改變列表內容 另一方面,該引用也可...

python可變與不可變

不可變作用和意義 物件所指的記憶體中的值是可以改變的。變數名儲存的是乙個位址,該位址指向乙個具體的物件,並且不管對變數的值進行怎樣的操作,都不會改變變數名的儲存位址。字典dict 列表list 集合set 1.list list1 1 2,3 4 print list1,id list1 1,2,3...