最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中的cls變量的功能和用法

 更新時(shí)間:2025年06月04日 08:54:14   作者:DECHIN  
本文介紹了在Python的classmethod裝飾的類(lèi)方法的cls變量的意義,通過(guò)幾個(gè)不同的示例對(duì)比,凸顯cls變量在Python編程中的應(yīng)用場(chǎng)景,本文通過(guò)一些具體示例,來(lái)演示cls參數(shù)的功能和用法,感興趣的朋友一起看看吧

技術(shù)背景

在Python的類(lèi)型設(shè)計(jì)中,有時(shí)候會(huì)遇到一個(gè)cls參數(shù)。其實(shí)cls參數(shù)就是一個(gè)約定俗成的名稱(chēng),用其他的名字也能正常運(yùn)行但不建議這么用。它的作用類(lèi)似于實(shí)例方法中的self參數(shù),代表的是類(lèi)本身,可以用于訪問(wèn)類(lèi)的參數(shù)和類(lèi)的方法。本文通過(guò)一些具體示例,來(lái)演示cls參數(shù)的功能和用法。

簡(jiǎn)單類(lèi)實(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類(lèi)型的操作邏輯是,在初始化函數(shù)中初始化一個(gè)prefix變量,然后在excute中調(diào)用打印函數(shù),打印prefix變量和一個(gè)外部輸入變量的整合字符串,執(zhí)行效果如下:

Hello   Bob
Hello   Alice

這個(gè)方法的一個(gè)局限性在于,類(lèi)Test中的函數(shù),如excute函數(shù),必須要新建一個(gè)實(shí)例t之后,才能夠調(diào)用到它的excute方法。如果跳過(guò)初始化的步驟直接調(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類(lèi)中的函數(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方法

通過(guò)classmethod方法,可以允許我們不需要在外部對(duì)類(lèi)初始化,而直接訪問(wèn)到類(lèi)的內(nèi)部屬性、參數(shù)和函數(shù)。也就是對(duì)于classmethod裝飾的函數(shù),約定使用cls變量作為開(kāi)頭。

class Test:
    prefix = "Hello\t"
    @classmethod
    def excute(cls, x):
        print (cls.prefix+x)
x = "Bob"
Test.excute(x)

這樣就可以直接在外部調(diào)用到類(lèi)的內(nèi)部函數(shù):

Hello   Bob

當(dāng)然,前面提到過(guò),這里即使換一個(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ù)代表的是類(lèi)本身,因此可以執(zhí)行成功:

Hello   Bob

這里需要說(shuō)明的是,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è)初始化的步驟。那么有一種情況是,類(lèi)似于prefix這種的類(lèi)屬性是在__init__函數(shù)中定義的,這是比較常見(jiàn)的情況。在這種情況下,如果不初始化一個(gè)實(shí)例,就無(wú)法訪問(wèn)到初始化參數(shù)。但是前面也提到了,cls就代表類(lèi)本身,那么自然可以通過(guò)cls來(lái)訪問(wèn)類(lèi)中的函數(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í),通過(guò)classmethod,可以修改類(lèi)的屬性:

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)然,修改屬性這樣的操作,在普通的類(lèi)實(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,也可以通過(guò)staticmethod來(lái)實(shí)現(xiàn)一個(gè)類(lèi)似功能:

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)用類(lèi)函數(shù),但是需要手動(dòng)初始化一個(gè)實(shí)例。輸出結(jié)果是一致的:

Hello   Bob
Hello   Bob     Alice

總結(jié)概要

本文介紹了在Python的classmethod裝飾的類(lèi)方法的cls變量的意義,通過(guò)幾個(gè)不同的示例對(duì)比,凸顯cls變量在Python編程中的應(yīng)用場(chǎng)景。對(duì)于大多數(shù)的場(chǎng)景來(lái)說(shuō),使用普通的Python類(lèi)和函數(shù)定義即可。如果需要在類(lèi)的外部使用類(lèi)的內(nèi)部函數(shù),但是可能有多個(gè)不同初始化的類(lèi)輸入,那么可以使用staticmethod進(jìn)行裝飾。如果只有一個(gè)類(lèi),而有多種不同的輸入場(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)文章

最新評(píng)論

鲜城| 仙桃市| 深水埗区| 榆林市| 宜州市| 东乌珠穆沁旗| 镇坪县| 垣曲县| 三原县| 谢通门县| 黄陵县| 肇州县| 蒙山县| 台南市| 南城县| 平潭县| 南投县| 南宫市| 本溪市| 土默特左旗| 筠连县| 佛冈县| 韶关市| 怀远县| 信丰县| 巴彦县| 依兰县| 务川| 和硕县| 平武县| 喀喇| 盱眙县| 阜城县| 蒲城县| 宿州市| 普定县| 云安县| 铜川市| 右玉县| 富锦市| 辽中县|