上一篇文章介紹了什麼是python 中的self,詳情請參考:
Python面試高頻問題:self到底是什麼
簡單的說self是類(Class)實例化的對象。
面試中還有一個問題經常被提及,那就是——什麼是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是一個類,那麼我們就可以使用他來進行實例化,具體代碼如下:
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 還可以在python類中的方法 __new__裡實現,通常定義為:
class class_name:
def __new__(cls, *args, **kwargs):
return super(class_name, cls).__new__(cls, *args, **kwargs)
接下來我會寫一篇文章關於__new__ 和__init__ ,也請大家持續關注!
最後我們可以簡單地總結一下self 和 cls:簡單的說self是類(Class)實例化的對象。
cls 是類(或子類)本身。我們也可以方便地理解self表示實例的,cls則表示類的!