繼承自object的新式類才有new
new至少要有一個參數(shù)cls科展,代表要實(shí)例化的類藻雌,new方法負(fù)責(zé)創(chuàng)建一個實(shí)例對象栅贴,在對象被創(chuàng)建的時候調(diào)用該方法它是一個類方法著瓶。new方法在返回一個實(shí)例之后瞳秽,會自動的調(diào)用init方法瓣履,對實(shí)例進(jìn)行初始化。如果new方法不返回值练俐,或者返回的不是實(shí)例袖迎,那么它就不會自動的去調(diào)用init方法。此參數(shù)在實(shí)例化時由Python解釋器自動提供
new必須要有返回值痰洒,返回實(shí)例化出來的實(shí)例瓢棒,這點(diǎn)在自己實(shí)現(xiàn)new時要特別注意,可以return父類new出來的實(shí)例丘喻,或者直接是object的new出來的實(shí)例
init有一個參數(shù)self脯宿,就是這個new返回的實(shí)例,init在new的基礎(chǔ)上可以完成一些其它初始化的動作泉粉,init不需要返回值
若new沒有正確返回當(dāng)前類cls的實(shí)例连霉,那init是不會被調(diào)用的榴芳,即使是父類的實(shí)例也不行
舉個例子、繼承l(wèi)ist
class MyList(list):
def __init__(self):
print 'inti'
def __new__(cls,*args, **kwargs):
print "new %s"%cls
return list.__new__(cls, *args, **kwargs)
def __call__(self, *arg):
print arg
a = MyList()
print a('xxx')