精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python中普通方法、靜態(tài)方法、類方法的區(qū)別

科技綠洲 ? 來(lái)源:AirPython ? 作者:AirPython ? 2023-11-02 11:03 ? 次閱讀

1. 場(chǎng)景

前幾天,有一個(gè)小伙伴過(guò)來(lái)問(wèn)我,Python 中的 @staticmethod、@classmethod、self、cls 分別代表什么意思,自己平時(shí)光顧著用,不知道具體的含義?

事實(shí)上,由于 Python 語(yǔ)言的靈活性,這部分內(nèi)容在日常編碼過(guò)程中,很容易被忽略掉

本篇文章將和大家一起聊聊這幾個(gè)小知識(shí)點(diǎn)

2.@staticmethod

裝飾器 @staticmethod 修飾的方法稱為:靜態(tài)方法,和普通的函數(shù)沒(méi)有什么區(qū)別

下面將聊聊實(shí)際項(xiàng)目中幾種應(yīng)用場(chǎng)景

1、要調(diào)用一個(gè)靜態(tài)方法,一般使用形式是:「 類名.方法名() 」

class Web(object):
    @staticmethod
    def foo_staticmethod():
        """靜態(tài)方法"""
        pass


if __name__ == '__main__':
    # 直接使用類名+方法名調(diào)用
    Web.foo_staticmethod()

當(dāng)然,也可以實(shí)例化一個(gè)類對(duì)象,通過(guò)這個(gè)對(duì)象去調(diào)用靜態(tài)方法,但是不建議使用這種方式

# 實(shí)例化一個(gè)對(duì)象
instance = Web()

# 使用實(shí)例對(duì)象去調(diào)用靜態(tài)方法(不建議)
instance.foo_staticmethod()

2、針對(duì)類中定義的靜態(tài)變量,可以使用「 類名.變量名 」 的形式去訪問(wèn)

class Web(object):
    # 靜態(tài)變量(類變量)
    name = "Python_Web"

    @staticmethod
    def foo_staticmethod():
        """靜態(tài)方法"""
        # 引用靜態(tài)變量
        print(Web.name)

3、靜態(tài)方法內(nèi)部使用其他靜態(tài)方法、類方法,同樣是使用「 類名.方法名() 」去調(diào)用

class Web(object):
    # 靜態(tài)變量(類變量)
    name = "Python_Web"

    # 類方法
    @classmethod
    def foo_classmethod_other(cls):
        print('類方法被調(diào)用!')

    # 另外一個(gè)靜態(tài)方法
    @staticmethod
    def foo_staticmethod_other():
        print('另外一個(gè)靜態(tài)方法被調(diào)用!')

    @staticmethod
    def foo_staticmethod():
        """靜態(tài)方法"""
        # 調(diào)用其他靜態(tài)方法
        print(Web.foo_staticmethod_other()) 

        # 調(diào)用類方法
        print(Web.foo_classmethod_other())

4、靜態(tài)方法內(nèi)部調(diào)用普通方法,訪問(wèn)實(shí)例屬性

普通方法和實(shí)例屬性都必須通過(guò)實(shí)例對(duì)象去引用,不能直接使用類名去訪問(wèn)

class Web(object):
    def __init__(self):
        self.desc = "實(shí)例屬性,不共享"

    def norm_method(self):
        """普通方法"""
        print('普通方法被調(diào)用!')

    @staticmethod
    def foo_staticmethod():
        """靜態(tài)方法"""
        instance = Web()

        # 獲取實(shí)例屬性
        print(instance.desc)

        # 調(diào)用普通方法
        instance.norm_method()

5、子類的使用

在子類中調(diào)用父類定義好的靜態(tài)方法,只需要將類名替換為子類名稱即可

class Web(object):

    @staticmethod
    def foo_staticmethod(arg1, arg2):
        pass

class Django(Web):
    """子類"""
    pass

if __name__ == '__main__':
    # 1、使用類名(父類)去調(diào)用靜態(tài)方法
    Web.foo_staticmethod("Hello", ",AirPython")

    # 2、使用類名(子類)去調(diào)用靜態(tài)方法
    Django.foo_staticmethod("Hello", ",AirPython")

3.@classmethod

裝飾器 @classmethod 修飾的方法稱為:類方法,在使用的時(shí)候,會(huì)將類本身作為第一個(gè)參數(shù) cls 傳遞給類方法

# 類方法,第一個(gè)參數(shù)為cls,代表類本身
@classmethod
def foo_classmethod(cls):
    pass

其中,cls 代表外層類本身,可以實(shí)例化,也可以直接調(diào)用靜態(tài)方法、類方法、靜態(tài)變量

下面逐一進(jìn)行說(shuō)明

1、要調(diào)用一個(gè)類方法,一般使用形式是:「 類名.方法名() 」

class Web(object):

    # 類方法,第一個(gè)參數(shù)為cls,代表類本身
    @classmethod
    def foo_classmethod(cls):
        pass

if __name__ == '__main__':
    # 使用類名去調(diào)用類方法
    Web.foo_classmethod()

和靜態(tài)方法類似,也可以實(shí)例化一個(gè)類對(duì)象,通過(guò)這個(gè)對(duì)象去調(diào)用靜態(tài)方法,但是不建議使用這種方式

2、調(diào)用靜態(tài)變量

靜態(tài)方法內(nèi)部引用靜態(tài)變量有兩種方式,分別是:

  • 「 類名.變量名 」
  • 「 cls.變量名 」

注意:由于 cls 代表就是外層類本身,所以這兩種方式等效

class Web(object):
    # 靜態(tài)變量(類變量)
    name = "Python_Web"

    # 類方法,第一個(gè)參數(shù)為cls,代表類本身
    @classmethod
    def foo_classmethod(cls):
        # 調(diào)用靜態(tài)變量方式一
        print(cls.name)

        # 調(diào)用靜態(tài)變量方式二
        print(Web.name)

3、類方法內(nèi)部調(diào)用其他類方法、靜態(tài)方法

在一個(gè)類方法內(nèi)部,可以使用「 類名.類方法名() 」、「 類名.靜態(tài)方法名() 」的形式去調(diào)用方法

class Web(object):

    # 靜態(tài)方法
    @staticmethod
    def foo_staticmethod():
        print('靜態(tài)方法被調(diào)用!')

    # 其他類方法
    @classmethod
    def foo_classmethod_other(cls):
        print('另外一個(gè)類方法被調(diào)用!')

    # 類方法,第一個(gè)參數(shù)為cls,代表類本身
    @classmethod
    def foo_classmethod(cls):
        # 調(diào)用其他類方法
        cls.foo_classmethod_other()

        # 調(diào)用靜態(tài)方法
        cls.foo_staticmethod()


if __name__ == '__main__':
    Web.foo_classmethod()

4、類方法內(nèi)部調(diào)用普通方法,訪問(wèn)實(shí)例屬性

需要通過(guò) cls 變量實(shí)例化一個(gè)類對(duì)象,然后通過(guò)這個(gè)對(duì)象去調(diào)用普通方法和實(shí)例屬性

class Web(object):

    def __init__(self):
        self.desc = "實(shí)例屬性,不共享"

    def norm_method(self):
        """普通方法"""
        print('普通方法被調(diào)用!')

    # 類方法,第一個(gè)參數(shù)為cls,代表類本身
    @classmethod
    def foo_classmethod(cls):
        # 如果要調(diào)用實(shí)例屬性,必須使用cls實(shí)例化一個(gè)對(duì)象,然后再去引用
        print(cls().desc)

        # 如果要調(diào)用普通方法,必須使用cls實(shí)例化一個(gè)對(duì)象,然后再去引用
        cls().norm_method()

5、子類的使用

在子類中調(diào)用父類定義好的類方法,只需要將類名替換為子類名稱即可,代碼和靜態(tài)方法類似

4.區(qū)別

下面總結(jié)一下普通方法、靜態(tài)方法、類方法的區(qū)別

  • 普通方法:第一個(gè)參數(shù) self 代表實(shí)例對(duì)象本身,可以使用 self 直接引用定義的實(shí)例屬性和普通方法;如果需要調(diào)用靜態(tài)方法和類方法,通過(guò)「 類名.方法名() 」調(diào)用即可
  • 靜態(tài)方法:使用「 類名.靜態(tài)變量 」引用靜態(tài)變量,利用「 類名.方法名() 」調(diào)用其他靜態(tài)方法和類方法;如果需要調(diào)用普通方法,需要先實(shí)例化一個(gè)對(duì)象,然后利用對(duì)象去調(diào)用普通方法
  • 類方法:第一個(gè)參數(shù) cls 代表類本身(等價(jià)),通過(guò)「 cls.靜態(tài)變量 」或「 類名.靜態(tài)變量 」引用靜態(tài)變量,利用「 cls.方法名() 」或「 類名.方法名() 」去調(diào)用靜態(tài)方法和類方法;如果需要調(diào)用普通方法,需要先實(shí)例化一個(gè)對(duì)象,然后利用對(duì)象去調(diào)用普通方法
  • 靜態(tài)方法和類方法是針對(duì)類定義的,除了可以使用類名去調(diào)用,也可以使用實(shí)例對(duì)象去調(diào)用,但是不建議

5.最后

一般來(lái)說(shuō),如果方法內(nèi)部涉及到實(shí)例對(duì)象屬性的操作,建議用普通方法;如果方法內(nèi)部沒(méi)有操作實(shí)例屬性的操作,僅僅包含一些工具性的操作,建議使用靜態(tài)方法;而如果需要對(duì)類屬性,即靜態(tài)變量進(jìn)行限制性操作,則建議使用類方法

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編碼
    +關(guān)注

    關(guān)注

    6

    文章

    935

    瀏覽量

    54771
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4308

    瀏覽量

    62444
  • 靜態(tài)
    +關(guān)注

    關(guān)注

    1

    文章

    29

    瀏覽量

    14532
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4783

    瀏覽量

    84473
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    動(dòng)態(tài)庫(kù)封裝成python模塊的方法

    之前的文章 將靜態(tài)庫(kù)封裝成 python 模塊中講解了如何將靜態(tài)庫(kù)封裝成 python 模塊,靜態(tài)庫(kù)封裝相對(duì)來(lái)說(shuō)還是有點(diǎn)復(fù)雜,今天來(lái)介紹下動(dòng)
    發(fā)表于 07-13 15:24 ?628次閱讀

    Python多重繼承使用方法

    執(zhí)行父的__init__(self)方法;3. 下劃線開(kāi)頭的變量或方法,會(huì)被認(rèn)為是受保護(hù)的,不能直接點(diǎn)出來(lái),但如果強(qiáng)制打出來(lái)的話也一樣能用,只是會(huì)有警告;4. 靜態(tài)
    發(fā)表于 04-19 14:41

    如何使用Python? 優(yōu)勢(shì)有哪些?

    的下面有屬性和方法。可以將屬性理解為靜態(tài)的數(shù)據(jù),將方法理解為動(dòng)態(tài)的處理函數(shù)。比如,在下面的代碼定義了“學(xué)生”,其中_ _init_ _是
    發(fā)表于 07-30 18:08

    Python方法、實(shí)例方法靜態(tài)方法

    Python實(shí)例屬性和實(shí)例方法Python類屬性和方法
    發(fā)表于 11-05 06:25

    請(qǐng)問(wèn)Python方法、實(shí)例方法靜態(tài)方法是什么?

    Python方法、實(shí)例方法靜態(tài)方法
    發(fā)表于 11-09 07:13

    傳統(tǒng)靜態(tài)配置方法與動(dòng)態(tài)配置方法區(qū)別在哪?

    傳統(tǒng)靜態(tài)配置方法有什么缺點(diǎn)?MAC地址和IP地址的動(dòng)態(tài)配置方法是什么?傳統(tǒng)靜態(tài)配置方法與動(dòng)態(tài)配置方法
    發(fā)表于 05-27 06:51

    python靜態(tài)方法方法

    ;)小黑跳起來(lái)啦2. 方法與函數(shù)區(qū)別在前面,我們很經(jīng)常提到方法和函數(shù),為免有同學(xué)將他們混為一談,我這里總結(jié)一下他們的區(qū)別。在 Python
    發(fā)表于 03-07 16:56

    python執(zhí)行函數(shù)的九種方法

    post_taskrunning pre_taskrunning taskrunning post_task方法四:使用 getattr 動(dòng)態(tài)獲取執(zhí)行若把所有的函數(shù)是放在,并定義成靜態(tài)
    發(fā)表于 03-29 17:43

    ASIC靜態(tài)驗(yàn)證方法

    介紹了基于深亞微米 CMOS 工藝A S IC 電路設(shè)計(jì)流程靜態(tài)驗(yàn)證方法。將這種驗(yàn)證方法與以往的動(dòng)態(tài)驗(yàn)證方法進(jìn)行了比較, 結(jié)果表明, 前
    發(fā)表于 06-21 15:05 ?0次下載
    ASIC<b class='flag-5'>靜態(tài)</b>驗(yàn)證<b class='flag-5'>方法</b>

    python基礎(chǔ)教程之如何進(jìn)行靜態(tài)方法方法詳細(xì)筆記說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是python基礎(chǔ)教程之如何進(jìn)行靜態(tài)方法方法詳細(xì)筆記說(shuō)明資料免費(fèi)下載。
    發(fā)表于 01-04 17:01 ?17次下載
    <b class='flag-5'>python</b>基礎(chǔ)教程之如何進(jìn)行<b class='flag-5'>靜態(tài)</b><b class='flag-5'>方法</b>和<b class='flag-5'>類</b><b class='flag-5'>方法</b>詳細(xì)筆記說(shuō)明

    python靜態(tài)方法方法

    普通函數(shù) 舉個(gè)例子,如下這段代碼, run 普通的實(shí)例方法, eat 是靜態(tài)方法, jump
    的頭像 發(fā)表于 03-07 16:56 ?1560次閱讀

    Python的屬性和方法是什么

    編程我們用來(lái)創(chuàng)建對(duì)象。日常生活的汽車設(shè)計(jì)圖就是我們Python。日常生活
    的頭像 發(fā)表于 02-23 10:17 ?844次閱讀

    Python和對(duì)象詳解

    Python 是一種面向?qū)ο蟮木幊陶Z(yǔ)言,它支持和對(duì)象。是一種用戶自定義的數(shù)據(jù)類型,用于定義對(duì)象的屬性和方法。對(duì)象是的實(shí)例,它包含
    的頭像 發(fā)表于 04-20 16:53 ?1067次閱讀

    java抽象可以有普通方法

    Java的抽象可以有普通方法,但它也可以有抽象方法。抽象是一種中間狀態(tài),介于
    的頭像 發(fā)表于 11-21 10:22 ?1496次閱讀

    this可以出現(xiàn)在方法

    用 this 關(guān)鍵字時(shí),編譯器會(huì)發(fā)出錯(cuò)誤提示,因?yàn)?b class='flag-5'>類方法靜態(tài)方法,沒(méi)有與它們關(guān)聯(lián)的特定對(duì)象實(shí)例。然而,在特定情況下,我們可以使用 this 關(guān)鍵字在
    的頭像 發(fā)表于 11-28 16:24 ?1350次閱讀