上一篇文章介紹了什么是python 中的self担敌,詳情請參考:
簡單的說self是類(Class)實例化的對象。
面試中還有一個問題經(jīng)常被提及,那就是——什么是cls呢苛谷?
cls定義
cls?是類(或子類)本身封寞,取決于調(diào)用的是哪個類痘昌。
看下面的實例
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'>
我們也可以通過實例的方法調(diào)用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 作為方法參數(shù)時,通常該方法需要由@classmethod 修飾惭适,@classmethod修飾的方法表示的是類方法。這里需要注意cls就是一個標(biāo)識楼镐,你可以把他寫成abc癞志,bcd都是可以的,只是出于習(xí)慣寫成了cls框产。
cls是一個類
既然cls是一個類凄杯,那么我們就可以使用他來進(jìn)行實例化,具體代碼如下:
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()秉宿,成功創(chuàng)建了兩個實例戒突,分別是0x000000690A1E0C08和0x000000690A1E0C48,而這兩個實例的類型都是MyClass3'
cls作為__new__的參數(shù)
另外cls 還可以在python類中的方法 __new__里實現(xiàn)描睦,通常定義為:
class class_name:
? ? ? ? def __new__(cls, *args, **kwargs):
? ? ? ? ? ? ? return super(class_name, cls).__new__(cls, *args, **kwargs)
接下來我會寫一篇文章關(guān)于__new__ 和__init__ 膊存,也請大家持續(xù)關(guān)注!
總結(jié)cls和self
最后我們可以簡單地總結(jié)一下self 和 cls:簡單的說self是類(Class)實例化的對象忱叭。
cls是類(或子類)本身隔崎。我們也可以方便地理解self表示實例的,cls則表示類的韵丑!