1. 程式人生 > >python中方法、函式、例項方法、類方法、靜態方法的理解

python中方法、函式、例項方法、類方法、靜態方法的理解

python中的方法、函式、例項方法、類方法、靜態方法的理解

方法與函式

def func():
    print("this is a 函式")

class A(object):
	def func():
		print("this is a 方法")

從上面的程式碼,我相信你已經知道方法與函式的區別了。重複一遍,同樣一個func(),獨立就是函式(function),在類中就是方法(method)。

例項方法、類方法、靜態方法

class A(object):
    item = 1
    def foo(self,x):
        print "executing foo(%s,%s)"%(self,x)
 
    @classmethod
    def class_foo(cls,x):
        print "executing class_foo(%s,%s)"%(cls,x)
 
    @staticmethod
    def static_foo(x):
        print "executing static_foo(%s)"%x

對於上述程式碼,有人可能對self,cls,classmethod,staticmethod感到疑惑。那麼首先理解下函式引數裡面的self和cls,這個self和cls是對例項或者類的繫結,對於一般的函式來說我們可以直接呼叫 foo(x) ,這個函式就是最常用的,它的工作跟任何東西(類,例項)無關,但是類中的foo(self,x)必須要有一個例項才可以呼叫。

例項方法

對於例項方法,我們知道在類裡每次定義方法的時候都需要繫結這個例項,就是 foo(self, x) ,為什麼要這麼做呢?因為例項方法的呼叫離不開例項,我們需要把例項自己傳給函式,呼叫的時候是這樣的a.foo(x)(其實是foo(a, x))。

類方法

類方法也一樣,只不過它傳遞的是類而不是例項,A.class_foo(x) 。(這裡的self和cls可以替換別的引數,但是大家約定的是這兩個,不建議用別的。)

靜態方法

對於靜態方法其實和普通的方法一樣,不需要對誰進行繫結,唯一的區別是呼叫的時候需要使用 a.static_foo(x) 或者 A.static_foo(x) 來呼叫。

為了便於理解,我舉個栗子:

櫃子A中有一些物品foo、class_foo、static_foo、item,當櫃子不屬於你時,你不能使用它們任何一個(當然你可以直接用櫃子外面的函式)。如果你想要用foo,那麼你必須將買一個一模一樣的櫃子(這就是例項化),這樣你就可以使用這4個物品。
但有時你只想使用static_foo,因為它僅僅在櫃子A中(為了整合功能),但是它其實與A關係不大,那麼除了剛才去買A櫃子的方法,你還可以使用A.static_foo開啟櫃子直接呼叫。
不過有時你想要知道item到底是什麼,你需要獲取它,這時你不能用別人的櫃子(可能item被改動了),你需要原裝的櫃子,這時有兩種方法,一是你可以再買一個櫃子(例項化),進行檢視,不過開銷大,二是呼叫class_foo,相當於開啟原裝櫃子,直接看一眼,這樣開銷小。

例項方法 類方法 靜態方法
a =A() a.foo(x) a.class_foo(x) a.static_foo(x)
A 不可用 A.class_foo(x) A.static_foo(x)