1.__new__(cls, *args, **kwargs) 創(chuàng)建對(duì)象時(shí)調(diào)用,返回當(dāng)前對(duì)象的一個(gè)實(shí)例;注意:這里的第一個(gè)參數(shù)是cls即class本身
2.__init__(self, *args, **kwargs) 創(chuàng)建完對(duì)象后調(diào)用,對(duì)當(dāng)前對(duì)象的實(shí)例的一些初始化,無(wú)返回值,即在調(diào)用__new__之后,根據(jù)返回的實(shí)例初始化;注意,這里的第一個(gè)參數(shù)是self即對(duì)象本身【注意和new的區(qū)別】
3.__call__(self, *args, **kwargs) 如果類實(shí)現(xiàn)了這個(gè)方法,相當(dāng)于把這個(gè)類型的對(duì)象當(dāng)作函數(shù)來(lái)使用,相當(dāng)于 重載了括號(hào)運(yùn)算符
看具體的例子:
def __init__(self, *args, **kwargs):
print "init"
super(O, self).__init__(*args, **kwargs)
def __new__(cls, *args, **kwargs):
print "new", cls
return super(O, cls).__new__(cls, *args, **kwargs)
def __call__(self, *args, **kwargs):
print "call"
oo = O()
print "________"
oo()
可不可以重載__init__方法呢?明顯不可以,因?yàn)開_init__之前調(diào)用了__new__方法,這時(shí)候已經(jīng)生成了一個(gè)對(duì)象了,沒(méi)辦法實(shí)現(xiàn)單例模式
新聞熱點(diǎn)
疑難解答
圖片精選