程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python 面試高頻問題:cls到底是什麼

編輯:Python

 

上一篇文章介紹了什麼是python 中的self,詳情請參考:

Python面試高頻問題:self到底是什麼

簡單的說self是類(Class)實例化的對象。

面試中還有一個問題經常被提及,那就是——什麼是cls呢?

cls定義

cls 是類(或子類)本身,取決於調用的是哪個類。

看下面的實例

class MyClass1():
@classmethod
def test_cls(cls):
print(cls)
class MyClass2():
@classmethod
def test_cls(cls):
print(cls)
MyClass1.test_cls()
MyClass2.test_cls()

輸出:

<class '__main__.MyClass1'>

<class '__main__.MyClass2'>

我們也可以通過實例的方法調用class method,例如:

MyClass1.test_cls()
MyClass2.test_cls()
my1=MyClass1()
my2=MyClass2()
my1.test_cls()
my2.test_cls()

同樣輸出

輸出:

<class '__main__.MyClass1'>

<class '__main__.MyClass2'>

使用cls 作為方法參數時,通常該方法需要由@classmethod 修飾,@classmethod修飾的方法表示的是類方法。這裡需要注意cls就是一個標識,你可以把他寫成abc,bcd都是可以的,只是出於習慣寫成了cls。

cls是一個類

既然cls是一個類,那麼我們就可以使用他來進行實例化,具體代碼如下:

class MyClass3():
@classmethod
def test_cls_obj(cls):
obj1 = cls()
obj2 = cls()
print(obj1)
print(obj2)
print(type(obj1))
print(type(obj2))
MyClass3.test_cls_obj()

輸出:

<__main__.MyClass3 object at 0x000000690A1E0C08>

<__main__.MyClass3 object at 0x000000690A1E0C48>

<class '__main__.MyClass3'>

<class '__main__.MyClass3'>

可以看到通過obj1=cls()和obj2=cls(),成功創建了兩個實例,分別是0x000000690A1E0C08和0x000000690A1E0C48,而這兩個實例的類型都是MyClass3'

cls作為__new__的參數

另外cls 還可以在python類中的方法 __new__裡實現,通常定義為:

class class_name:
def __new__(cls, *args, **kwargs):
return super(class_name, cls).__new__(cls, *args, **kwargs)

接下來我會寫一篇文章關於__new__ 和__init__ ,也請大家持續關注!

總結cls和self

最後我們可以簡單地總結一下self 和 cls:簡單的說self是類(Class)實例化的對象。

cls 是類(或子類)本身。我們也可以方便地理解self表示實例的,cls則表示類的!


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved