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

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

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

技術背景

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

簡單類實現(xiàn)

首先我們用普通的方法做一個最基本的測試案例:

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ù)中初始化一個prefix變量,然后在excute中調用打印函數(shù),打印prefix變量和一個外部輸入變量的整合字符串,執(zhí)行效果如下:

Hello   Bob
Hello   Alice

這個方法的一個局限性在于,類Test中的函數(shù),如excute函數(shù),必須要新建一個實例t之后,才能夠調用到它的excute方法。如果跳過初始化的步驟直接調用excute方法:

class Test:
    def __init__(self):
        self.prefix = "Hello\t"
    def excute(self, x):
        print (self.prefix+x)
Test.excute()

運行結果會告訴你,這需要兩個變量的輸入才能夠正常的運行:

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'

例如,我們先初始化一個t實例,但是方法調用我們不調用t中的excute函數(shù),而是直接調用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)

這樣也是可以正常運行的:

Hello   Bob

classmethod方法

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

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

這樣就可以直接在外部調用到類的內部函數(shù):

Hello   Bob

當然,前面提到過,這里即使換一個變量名,也是可以正常運行的:

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

因為第一個參數(shù)代表的是類本身,因此可以執(zhí)行成功:

Hello   Bob

這里需要說明的是,classmethod裝飾器的作用,就是把函數(shù)的第一個參數(shù)相關的內容給省去了,如果不使用classmethod進行裝飾,例如:

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

這樣運行會報錯:

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'

提示的內容是參數(shù)缺失,其實也就是少了一個初始化的步驟。那么有一種情況是,類似于prefix這種的類屬性是在__init__函數(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)

這個代碼可以被正確執(zhí)行:

Hello   Bob

同時,通過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ù)中,每次打印之后,都會修改一下prefix參數(shù),所以打印輸出結果如下:

Hello   Bob
Hello   Bob     Alice

當然,修改屬性這樣的操作,在普通的類實現(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得到的結果是一樣的:

Hello   Bob
Hello   Bob     Alice

如果不使用classmethod,也可以通過staticmethod來實現(xiàn)一個類似功能:

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不對參數(shù)進行初始化,雖然可以在外部直接調用類函數(shù),但是需要手動初始化一個實例。輸出結果是一致的:

Hello   Bob
Hello   Bob     Alice

總結概要

本文介紹了在Python的classmethod裝飾的類方法的cls變量的意義,通過幾個不同的示例對比,凸顯cls變量在Python編程中的應用場景。對于大多數(shù)的場景來說,使用普通的Python類和函數(shù)定義即可。如果需要在類的外部使用類的內部函數(shù),但是可能有多個不同初始化的類輸入,那么可以使用staticmethod進行裝飾。如果只有一個類,而有多種不同的輸入場景下,可以使用classmethod進行裝飾。

版權聲明

本文首發(fā)鏈接為:https://www.cnblogs.com/dechinphy/p/cls.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

請博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

到此這篇關于Python中的cls變量的文章就介紹到這了,更多相關Python中的cls變量內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

始兴县| 赤城县| 澄江县| 五台县| 务川| 揭东县| 丰镇市| 北辰区| 三原县| 淮安市| 乌兰浩特市| 武鸣县| 望奎县| 庐江县| 潢川县| 梅州市| 满洲里市| 会同县| 元江| 麻栗坡县| 福贡县| 临高县| 常州市| 东方市| 广灵县| 西贡区| 德江县| 高雄县| 布拖县| 万州区| 巴中市| 西乌| 东阿县| 建水县| 张家界市| 卓资县| 吉林省| 永兴县| 台南市| 威信县| 漳州市|