一、總體說明
python類里會出現這三個單詞,self和cls都可以用別的單詞代替,類的方法有三種,
一是通過def定義的 普通的一般的,需要至少傳遞一個參數,一般用self,這樣的方法必須通過一個類的實例去訪問,類似於c++中通過對象去訪問;
二是在def前面加上@classmethod,這種類方法的一個特點就是可以通過類名去調用,但是也必須傳遞一個參數,一般用cls表示class,表示可以通過類直接調用;
三是在def前面加上@staticmethod,這種類方法是靜態的類方法,類似於c++的靜態函數,他的一個特點是參數可以為空,同樣支持類名和對象兩種調用方式;
普通的方法,第一個參數需要是self,它表示一個具體的實例本身。
如果用了staticmethod,那么就可以無視這個self,而將這個方法當成一個普通的函數使用。
而對於classmethod,它的第一個參數不是self,是cls,它表示這個類本身。
>>> class A(object):
def foo1(self):
print "Hello",self
@staticmethod
def foo2():
print "hello"
@classmethod
def foo3(cls):
print "hello",cls
>>> a = A()
>>> a.foo1() #最常見的調用方式,但與下面的方式相同
Hello <__main__.A object at 0x9f6abec>
>>> A.foo1(a) #這里傳入實例a,相當於普通方法的self
Hello <__main__.A object at 0x9f6abec>
>>> A.foo2() #這里,由於靜態方法沒有參數,故可以不傳東西
hello
>>> A.foo3() #這里,由於是類方法,因此,它的第一個參數為類本身。
hello <class '__main__.A'>
>>> A #可以看到,直接輸入A,與上面那種調用返回同樣的信息。
<class '__main__.A'>
二、深入理解
其實self,cls不是關鍵字,例如
class
A:
member
=
"this is a test."
def
__init__(
self
):
pass
@
classmethod
def
Print1(
cls
):
print
"print 1: "
,
cls
.membe
def
Print2(
self
):
print
"print 2: "
,
self
.member
@
classmethod
def
Print3(paraTest):
print
"print 3: "
, paraTest.member
a
=
A()
A.Print1()
#相當於Print1(A)
a.Print2()
#相當於Print2(a), 請注意@classmethod
A.Print3()
