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