一直以來都以爲函數和方法是一個東西,平時區分也不是很詳細,後來一搜索發現自己平時叫法是錯的。
先看一段代碼
def fun():
pass
print fun
結果如下:
<function fun at 0x00000000022BC3C8>
可以看出:
單獨定義的一個function是function,它是一個函數。我個人的理解是,在class外部定義的可執行函數,都是函數。
再看另外一段代碼
# coding:utf-8
class Apple:
def fun1(self):
return 'normal'
@staticmethod
def fun2():
return 'staticmethod'
@classmethod
def fun3(cls):
return 'classmethod'
print Apple.fun1
print Apple.fun2
print Apple.fun3
print "-"*80
apple = Apple()
print apple.fun1
print apple.fun2
print apple.fun3
結果如下:
<unbound method Apple.fun1>
<function fun2 at 0x00000000021DC4A8>
<bound method classobj.fun3 of <class __main__.Apple at 0x0000000001D8C768>>
-------------------------------------------------------------------------------------
<bound method Apple.fun1 of <__main__.Apple instance at 0x00000000021DAE08>>
<function fun2 at 0x00000000021DC4A8>
<bound method classobj.fun3 of <class __main__.Apple at 0x0000000001D8C768>>
可以看出:
- 在class內定義的普通方法,如fun1,因爲它是要面向將來實例化對象的,其實它就是一個實例方法。它屬於method,是一個方法。
- 在class內定義的靜態方法,如fun2,它與任何對象都沒有聯繫,等同於是在class外定義的function,它屬於函數。
- 在class內定義的類方法,如fun3,它第一個參數必須是cls,它與class本身是綁定關係,它屬於方法。
簡單總結:
- 與類和實例無綁定關係的function都屬於函數(function);
- 與類和實例有綁定關係的function都屬於方法(method)。
謝謝,不對之處還請指正。