Python中的cls變量的功能和用法
技術(shù)背景
在Python的類型設(shè)計(jì)中,有時(shí)候會(huì)遇到一個(gè)cls
參數(shù)。其實(shí)cls
參數(shù)就是一個(gè)約定俗成的名稱,用其他的名字也能正常運(yùn)行但不建議這么用。它的作用類似于實(shí)例方法中的self
參數(shù),代表的是類本身,可以用于訪問類的參數(shù)和類的方法。本文通過一些具體示例,來演示cls
參數(shù)的功能和用法。
簡(jiǎn)單類實(shí)現(xiàn)
首先我們用普通的方法做一個(gè)最基本的測(cè)試案例:
class Test: def __init__(self): self.prefix = "Hello\t" def excute(self, x): print (self.prefix+x) t = Test() x = "Bob" t.excute(x) x = "Alice" t.excute(x)
這里Test
類型的操作邏輯是,在初始化函數(shù)中初始化一個(gè)prefix變量,然后在excute中調(diào)用打印函數(shù),打印prefix變量和一個(gè)外部輸入變量的整合字符串,執(zhí)行效果如下:
Hello Bob
Hello Alice
這個(gè)方法的一個(gè)局限性在于,類Test中的函數(shù),如excute函數(shù),必須要新建一個(gè)實(shí)例t之后,才能夠調(diào)用到它的excute方法。如果跳過初始化的步驟直接調(diào)用excute方法:
class Test: def __init__(self): self.prefix = "Hello\t" def excute(self, x): print (self.prefix+x) Test.excute()
運(yùn)行結(jié)果會(huì)告訴你,這需要兩個(gè)變量的輸入才能夠正常的運(yùn)行:
Traceback (most recent call last): File "/home/test_cls.py", line 8, in <module> Test.excute() TypeError: Test.excute() missing 2 required positional arguments: 'self' and 'x'
例如,我們先初始化一個(gè)t實(shí)例,但是方法調(diào)用我們不調(diào)用t中的excute函數(shù),而是直接調(diào)用Test類中的函數(shù):
class Test: def __init__(self): self.prefix = "Hello\t" def excute(self, x): print (self.prefix+x) t = Test() x = "Bob" Test.excute(t, x)
這樣也是可以正常運(yùn)行的:
Hello Bob
classmethod方法
通過classmethod方法,可以允許我們不需要在外部對(duì)類初始化,而直接訪問到類的內(nèi)部屬性、參數(shù)和函數(shù)。也就是對(duì)于classmethod裝飾的函數(shù),約定使用cls
變量作為開頭。
class Test: prefix = "Hello\t" @classmethod def excute(cls, x): print (cls.prefix+x) x = "Bob" Test.excute(x)
這樣就可以直接在外部調(diào)用到類的內(nèi)部函數(shù):
Hello Bob
當(dāng)然,前面提到過,這里即使換一個(gè)變量名,也是可以正常運(yùn)行的:
class Test: prefix = "Hello\t" @classmethod def excute(self, x): print (self.prefix+x) x = "Bob" Test.excute(x)
因?yàn)榈谝粋€(gè)參數(shù)代表的是類本身,因此可以執(zhí)行成功:
Hello Bob
這里需要說明的是,classmethod裝飾器的作用,就是把函數(shù)的第一個(gè)參數(shù)相關(guān)的內(nèi)容給省去了,如果不使用classmethod進(jìn)行裝飾,例如:
class Test: prefix = "Hello\t" def excute(cls, x): print (cls.prefix+x) x = "Bob" Test.excute(x)
這樣運(yùn)行會(huì)報(bào)錯(cuò):
Traceback (most recent call last):
File "/home/test_cls.py", line 7, in <module>
Test.excute(x)
TypeError: Test.excute() missing 1 required positional argument: 'x'
提示的內(nèi)容是參數(shù)缺失,其實(shí)也就是少了一個(gè)初始化的步驟。那么有一種情況是,類似于prefix這種的類屬性是在__init__函數(shù)中定義的,這是比較常見的情況。在這種情況下,如果不初始化一個(gè)實(shí)例,就無法訪問到初始化參數(shù)。但是前面也提到了,cls就代表類本身,那么自然可以通過cls來訪問類中的函數(shù),包括初始化的函數(shù):
class Test: def __init__(self): self.prefix = "Hello\t" @classmethod def excute(cls, x): cls.__init__(cls) print (cls.prefix+x) x = "Bob" Test.excute(x)
這個(gè)代碼可以被正確執(zhí)行:
Hello Bob
同時(shí),通過classmethod,可以修改類的屬性:
class Test: prefix = "Hello\t" @classmethod def excute(cls, x): print (cls.prefix+x) cls.prefix = cls.prefix+x+"\t" x = "Bob" Test.excute(x) x = "Alice" Test.excute(x)
這里在excute函數(shù)中,每次打印之后,都會(huì)修改一下prefix參數(shù),所以打印輸出結(jié)果如下:
Hello Bob
Hello Bob Alice
當(dāng)然,修改屬性這樣的操作,在普通的類實(shí)現(xiàn)中也是可以操作的:
class Test: def __init__(self): self.prefix = "Hello\t" def excute(self, x): print (self.prefix+x) self.prefix = self.prefix+x+"\t" t = Test() x = "Bob" t.excute(x) x = "Alice" t.excute(x)
用self得到的結(jié)果是一樣的:
Hello Bob
Hello Bob Alice
如果不使用classmethod,也可以通過staticmethod來實(shí)現(xiàn)一個(gè)類似功能:
class Test: def __init__(self): self.prefix = "Hello\t" @staticmethod def excute(self, x): print (self.prefix+x) self.prefix = self.prefix+x+"\t" t = Test() x = "Bob" Test.excute(t, x) x = "Alice" Test.excute(t, x)
但是staticmethod不對(duì)參數(shù)進(jìn)行初始化,雖然可以在外部直接調(diào)用類函數(shù),但是需要手動(dòng)初始化一個(gè)實(shí)例。輸出結(jié)果是一致的:
Hello Bob
Hello Bob Alice
總結(jié)概要
本文介紹了在Python的classmethod裝飾的類方法的cls變量的意義,通過幾個(gè)不同的示例對(duì)比,凸顯cls變量在Python編程中的應(yīng)用場(chǎng)景。對(duì)于大多數(shù)的場(chǎng)景來說,使用普通的Python類和函數(shù)定義即可。如果需要在類的外部使用類的內(nèi)部函數(shù),但是可能有多個(gè)不同初始化的類輸入,那么可以使用staticmethod進(jìn)行裝飾。如果只有一個(gè)類,而有多種不同的輸入場(chǎng)景下,可以使用classmethod進(jìn)行裝飾。
版權(quán)聲明
本文首發(fā)鏈接為:https://www.cnblogs.com/dechinphy/p/cls.html
作者ID:DechinPhy
更多原著文章:https://www.cnblogs.com/dechinphy/
請(qǐng)博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html
到此這篇關(guān)于Python中的cls變量的文章就介紹到這了,更多相關(guān)Python中的cls變量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python延時(shí)操作實(shí)現(xiàn)方法示例
這篇文章主要介紹了Python延時(shí)操作實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Python基于sched庫(kù)與time庫(kù)實(shí)現(xiàn)延時(shí)操作的方法,需要的朋友可以參考下2018-08-08Python列表數(shù)據(jù)如何按區(qū)間分組統(tǒng)計(jì)各組個(gè)數(shù)
這篇文章主要介紹了Python列表數(shù)據(jù)如何按區(qū)間分組統(tǒng)計(jì)各組個(gè)數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Pandas:DataFrame對(duì)象的基礎(chǔ)操作方法
今天小編就為大家分享一篇Pandas:DataFrame對(duì)象的基礎(chǔ)操作方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06Python3 中作為一等對(duì)象的函數(shù)解析
這篇文章主要介紹了Python3 中作為一等對(duì)象的函數(shù),本文通過實(shí)例代碼講解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12