cls是class的縮寫。
專注于為中小企業(yè)提供成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)碧江免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了數(shù)千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
class A:
member = "this is a test."
def __init__(self):
pass
@classmethod
def Print1(cls):
#榪欎釜鏄被鏂規(guī)硶
print "print 1: ", cls.member
def Print2(self):
print "print 2: ", self.member
@classmethod
def Print3(paraTest):
print "print 3: ", paraTest.member
a = A()
A.Print1() #相當(dāng)于Print1(A)
a.Print2() #相當(dāng)于Print2(a), 請(qǐng)注意@classmethod
A.Print3()
可以看出來,python在通過“.”調(diào)用成員函數(shù)的時(shí)候,會(huì)將“.”前面的東西當(dāng)作函數(shù)的第一個(gè)參數(shù)調(diào)用。
而且pyhon并不關(guān)心我們把類的成員函數(shù)的第一個(gè)參數(shù)的名稱是什么,我們可以用任意的名稱,可以看Print3的定義就知道了。
普通的方法,第一個(gè)參數(shù)需要是self,它表示一個(gè)具體的實(shí)例本身。
如果用了staticmethod,那么就可以無視這個(gè)self,而將這個(gè)方法當(dāng)成一個(gè)普通的函數(shù)使用。
而對(duì)于classmethod,它的第一個(gè)參數(shù)不是self,是cls,它表示這個(gè)類本身。
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() #最常見的調(diào)用方式,但與下面的方式相同
Hello __main__.A object at 0x9f6abec
A.foo1(a) #這里傳入實(shí)例a,相當(dāng)于普通方法的self
Hello __main__.A object at 0x9f6abec
A.foo2() #這里,由于靜態(tài)方法沒有參數(shù),故可以不傳東西
hello
A.foo3() #這里,由于是類方法,因此,它的第一個(gè)參數(shù)為類本身。
hello class '__main__.A'
A #可以看到,直接輸入A,與上面那種調(diào)用返回同樣的信息。
class '__main__.A'
為了把類中的變量傳遞給類中的函數(shù),我們需要用到3個(gè)特定格式
① 第一個(gè)格式 @classmethod 的中文意思就是“類方法”,@classmethod聲明了函數(shù)1是類方法,這樣才能允許函數(shù)1使用類屬性中的數(shù)據(jù)。
② 第二個(gè)格式 cls 的意思是class的縮寫。如果類方法函數(shù)1想使用類屬性(也就是類中的變量),就要寫上cls為函數(shù)1的第一個(gè)參數(shù),也就是把這個(gè)類作為參數(shù)傳給自己,這樣就能被允許使用類中的數(shù)據(jù)。
③ 第三個(gè)格式是 cls.變量 。類方法想使用類屬性的時(shí)候,需要在這些變量名稱前加上cls. 這就好比類方法和類之間的約法三章,所以但凡有任何格式錯(cuò)誤都會(huì)報(bào)錯(cuò)。
如果缺①,即缺了“@classmethod”,類方法就不能直接利用類中的屬性,于是報(bào)錯(cuò)