__new__、__init__、__call__的介紹
在講到使用元類建立單例模式之前,比需了解__new__這個內建方法的作用,在上面講元類的時候我們用到了__new__方法來實現類的建立。然而我在那之前還是對__new__這個方法和__init__方法有一定的疑惑。因此這裡花點時間對其概念做一次了解和區分。
__new__ 建立新物件
__new__方法負責建立乙個例項物件,在物件被建立的時候呼叫該方法它是乙個類方法。__new__方法在返回乙個例項之後,會自動的呼叫__init__方法,對例項進行初始化。如果__new__方法不返回值,或者返回的不是例項,那麼它就不會自動的去呼叫__init__方法。
__init__ 例項化
__init__ 方法負責將該例項物件進行初始化,在物件被建立之後呼叫該方法,在__new__方法建立出乙個例項後對例項屬性進行初始化。__init__方法可以沒有返回值。
__call__ 呼叫
__call__方法其實和類的建立過程和例項化沒有多大關係了,定義了__call__方法才能被使用函式的方式執行。
例如:classa(object):def __call__(self):print "__call__ be called"a=a()
a()#輸出#__call__ be called
打個比方幫助理解:如果將建立例項的過程比作建乙個房子。
那麼class就是乙個房屋的設計圖,他規定了這個房子有幾個房間,每個人房間的大小朝向等。這個設計圖就是累的結構
__new__就是乙個房屋的框架,每個具體的房屋都需要先搭好框架後才能進行專修,當然現有了房屋設計才能有具體的房屋框架出來。這個就是從類到類例項的建立。
__init__就是裝修房子的過程,對房屋的牆面和地板等顏色材質的豐富就是它該做的事情,當然先有具體的房子框架出來才能進行裝飾了。這個就是例項屬性的初始化,它是在__new__出乙個例項後才能初始化。
__call__就是房子的**,有了固定**,才能被打**嘛(就是通過括號的方式像函式一樣執行)。
#coding:utf-8
classfoo(object):def __new__(cls, *args, **kwargs):#__new__是乙個類方法,在物件建立的時候呼叫
print "excute __new__"
return super(foo,cls).__new__(cls,*args,**kwargs)def __init__(self,value):#__init__是乙個例項方法,在物件建立後呼叫,對例項屬性做初始化
print "excute __init"self.value=value
f1= foo(1)printf1.value
f2= foo(2)printf2.value#輸出===:
excute __new__excute__initexcute__new__excute__init
#====可以看出new方法在init方法之前執行
子類如果重寫__new__方法,一般依然要呼叫父類的__new__方法。
classchild(foo):def __new__(cls, *args, **kwargs):return suyper(child, cls).__new__(cls, *args, **kwargs)
必須注意的是,類的__new__方法之後,必須生成本類的例項才能自動呼叫本類的__init__方法進行初始化,否則不會自動呼叫__init__.
classfoo(object):def __init__(self, *args, **kwargs):print "foo __init__"
def __new__(cls, *args, **kwargs):return object.__new__(stranger, *args, **kwargs)classstranger(object):def __init__(self,name):print "class stranger's __init__ be called"self.name=name
foo= foo("test")print type(foo) #
print foo.name #attributeerror: 'stranger' object has no attribute 'name'
#說明:如果new方法返回的不是本類的例項,那麼本類(foo)的init和生成的類(stranger)的init都不會被呼叫
執行python指令碼的幾種方法
linux有下列的幾種方法來執行python指令碼 注 我所用的python環境為 2.6 一.終端命令列下 python name.py 二.python環境中 若指令碼名稱為name.py,其內容為 a head b hehe print a,b 則使用 impport name 針對此種方法我...
Python呼叫C C 的種種方法
摘要 python是解釋性語言,底層就是用c實現的,所以用python呼叫c是很容易的,下面就總結一下各種呼叫的方法,給出例子,所有例子都在ubuntu9.10,python2.6下試過.1.python是解釋性語言,底層就是用c實現的,所以用python呼叫c是很容易的,下面就總結一下各種呼叫的方...
執行python指令碼的幾種方法
linux有下列的幾種方法來執行python指令碼 注 我所用的python環境為 2.6 一.終端命令列下 python name.py 二.python環境中 若指令碼名稱為name.py,其內容為 a head b hehe print a,b 則使用 impport name 針對此種方法我...