python學習之self,cls,staticmethod,classmethod


一、總體說明

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.Print1()    #相當於Print1(A)
a.Print2()    #相當於Print2(a), 請注意@classmethod
A.Print3()  
可以看出來,python在通過“.”調用成員函數的時候,會將“.”前面的東西當作函數的第一個參數調用。而且pyhon並不關心我們把類的成員函數的第一個參數的名稱是什么,我們可以用任意的名稱,可以看Print3的定義就知道了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM