Python – self , cls

Loading

測試環境為 CentOS 8 x86_64 (虛擬機)

在 Python 中 self 與 cls 的差異說明在 – https://peps.python.org/pep-0008/#function-and-method-arguments

  • Always use self for the first argument to instance methods.
    self 使用在需要實例化的 method .
  • Always use cls for the first argument to class methods.
    cls 使用在 @classmethod 的 method.

還有一點 self 與 cls 並不是關鍵字,我們可以用其他變數名稱來取代,我們來透過下面幾個範例來看一下 self 與 cls.

參考範例– https://levelup.gitconnected.com/method-types-in-python-2c95d46281cd

  • 範例 : self , cls 使用時機
    [root@localhost ~]# vi selfcls1.py
    class MethodTypes:
    
        name = "Unknow"
    
        def instanceMethod(self , name):
            self.lastname = name
            print('Old Name: ' , self.name)
            print('New Name: ' , self.lastname)
    
        @classmethod
        def classMethod(cls , name):
            cls.name = name
            print('Change Name: ' , cls.name)
    
    m = MethodTypes()
    m.instanceMethod('Ben')
    
    MethodTypes.classMethod('Ben10')
    
    m.instanceMethod('Ben20')
    

    執行結果

    [root@localhost ~]# python3 selfcls1.py
    Old Name:  Unknow
    New Name:  Ben
    Change Name:  Ben10
    Old Name:  Ben10
    New Name:  Ben20
    

    說明:
    一般類的 method 需要實例才能使用,需傳入第一個參數為 self .

        def instanceMethod(self , name):
            self.lastname = name
            print('Old Name: ' , self.name)
            print('New Name: ' , self.lastname)
    

    Class Method 在 Class def 函式加上 @classmethod 代表是 ClassMethods(不需要 self 參數,須加上 class 本身參數,通常命名為 cls) ,跟 StaticMethods 一樣不需要產生 instance 後才能使用函式,可以直接呼叫,可以呼叫 Class 的其他函數 .

        @classmethod
        def classMethod(cls , name):
            cls.name = name
            print('Change Name: ' , cls.name)
    
    
  • 範例 : self 與 cls 並不是關鍵字
    [root@localhost ~]# vi selfcls2.py
    class MethodTypes:
    
        name = "Unknow"
    
        def instanceMethod(it , name):
            it.lastname = name
            print('Old Name: ' , it.name)
            print('New Name: ' , it.lastname)
    
        @classmethod
        def classMethod(this , name):
            this.name = name
            print('Change Name: ' , this.name)
    
    m = MethodTypes()
    m.instanceMethod('Ben')
    
    MethodTypes.classMethod('Ben10')
    
    m.instanceMethod('Ben20')
    

    執行結果

    [root@localhost ~]# python3 selfcls2.py
    Old Name:  Unknow
    New Name:  Ben
    Change Name:  Ben10
    Old Name:  Ben10
    New Name:  Ben20
    

    說明:
    這是使用 it 取代前一範例的 self .

        def instanceMethod(it , name):
            it.lastname = name
            print('Old Name: ' , it.name)
            print('New Name: ' , it.lastname)
    

    這是使用 this 取代前一範例的 cls .

        @classmethod
        def classMethod(this , name):
            this.name = name
            print('Change Name: ' , this.name)
    

    從上面範例來看 self 與 cls 都是大家常用的約定寫法(名稱皆可自訂) , 所以不管何種物件的呼叫方法的 第一個參數 都會把自己當作該方法中的傳遞參數.

沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料