淺談python中的例項方法、類方法和靜態方法

NO IMAGE

在學習python程式碼時,看到有的類的方法中第一引數是cls,有的是self,經過了解得知,python並沒有對類中方法的第一個引數名字做限制,可以是self,也可以是cls,不過根據人們的慣用用法,self一般是在例項方法中使用,而cls則一般在類方法中使用,在靜態方法中則不需要使用一個預設引數。在下面的程式碼中,InstanceMethod類的方法中,第一個引數是預設的self,在這裡可以把self換成任何名字來表示,不會有任何影響。在類呼叫的時候,需要滿足引數的個數要求(引數中含有*args是例外),例如13行中,類呼叫沒有引數的時候,會提示錯誤。同樣,例項方法的引數個數也應該滿足要求,例如16行中也會報錯。例項方法的一個主要特點就是需要繫結到一個物件上,python解析器會自動把例項自身傳遞給方法,如14行所示,而直接使用InstanceMethod.f1()呼叫方法是不行的。


class InstanceMethod(object):
def __init__(self, a):
self.a = a
def f1(self):
print 'This is {0}.'.format(self)
def f2(self, a):
print 'Value:{0}'.format(a)
if __name__ == '__main__':
# im = InstanceMethod()
im = InstanceMethod('233')
im.f1()
# im.f2()
im.f2(233)

靜態方法和類方法都需要使用修飾器,分別使用的是staticmethod和classmethod。靜態方法是和類沒有關係的,我覺得就是包裝在類中的一般方法,如下例子中,呼叫靜態方法使用例項和不使用例項都是可以的。類方法中,預設的第一個引數使用的是cls,類方法也可以不需要例項而直接使用類呼叫。對於這三種不同的方法,使用方法如下例所示。那麼問題來了,既然有了例項方法,類方法和靜態方法與之相比又有什麼好處呢?

在類方法中,不管是使用例項還是類呼叫方法,都會把類作為第一個引數傳遞進來,這個引數就是類本身。如果繼承了這個使用類方法的類,該類的所有子類都會擁有了這個方法,並且這個方法會自動指向子類本身,這個特性在工廠函式中是非常有用的。靜態方法是和類與例項都沒有關係的,完全可以使用一般方法代替,但是使用靜態方法可以更好的組織程式碼,防止程式碼變大後變得比較混亂。類方法是可以替代靜態方法的。靜態方法不能在繼承中修改。


class test(object):
def instance_method(self):
print 'This is {0}'.format(self)
@staticmethod
def static_method():
print 'This is static method.'
@classmethod
def class_method(cls):
print 'This is {0}'.format(cls)
if __name__ == '__main__':
a = test()
a.instance_method()
a.static_method()
a.class_method()
print '----------------------------------------'
# test.instance_method()
test.static_method()
test.class_method()