測試環境為 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 都是大家常用的約定寫法(名稱皆可自訂) , 所以不管何種物件的呼叫方法的 第一個參數 都會把自己當作該方法中的傳遞參數.
沒有解決問題,試試搜尋本站其他內容