Instance Methods, Static Methods, Class Methods
九月 24, 2011, 11:44 a.m.
Python初學者對Instance Methods, Static Methods, Class Methods這三個名詞比較容易混淆,從字面意思上來看,Instance Methods是和實例(Instance)掛鉤、Static Methods大概和Java/C++的靜態方法差不多、而Class Method就不知道該如何解釋了,在這裡我們以實例來說明這三者的區別和用法。
最常見的Instance Methods是以第一個傳入參數(argument)為self為標誌,其處理的是實例屬性(instance attributes):
class Multi:
def imeth(self,x):
print self, x
使用時則是必須先實例化(instantiate)類別(class)才能呼叫(invoke):
>>> obj = Multi() >>> obj.imeth(1) <__main__.Multi instance…> 1 >>> obj.imeth(obj, 2) <__main__.Multi instance…> 2
Static Methods的確和Java/C++一樣,是用來處理類別屬性(class attributes)的,定義如下:
class Multi:
x = 0
@staticmethod
def smath():
Multi.x = Multi.x+1
print x
使用時可以自類別呼叫或自實例呼叫:
>>> obj = Multi() >>> obj.smeth() 1 >>> Multi.smeth() 2
最後Class Methods幾乎和Static Method一樣,除了Class Method的第一個參數(argument)是方法(method)被呼叫時使用的類別、或實例所屬的類別,定義如下:
Class Multi:
@classmethod
def cmeth(cls, x):
print cls, x
使用方法如下:
>>> obj = Multi() >>> Multi.cmeth(5) __main__.Multi 5 >>> obj.cmeth(6) __main__.Multi 6
注意__main__.Multi和<__main__.Multi instance…>的區別,一個是類別(class)一個是實例(instance),所以class method在繼承關係(inheritance)中,比方說你想要寫一個factory method(實例化類別用),用classmethod可以讓你正確的實例化該實例化的類別,即使呼叫該factory method的是原類別的子類別(subclass)。
