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

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

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

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

科技綠洲 ? 來源:AirPython ? 作者:AirPython ? 2023-11-02 11:03 ? 次閱讀

1. 場景

前幾天,有一個小伙伴過來問我,Python 中的 @staticmethod、@classmethod、self、cls 分別代表什么意思,自己平時光顧著用,不知道具體的含義?

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

本篇文章將和大家一起聊聊這幾個小知識點

2.@staticmethod

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

下面將聊聊實際項目中幾種應(yīng)用場景

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

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


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

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

# 實例化一個對象
instance = Web()

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

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

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)用!')

    # 另外一個靜態(tài)方法
    @staticmethod
    def foo_staticmethod_other():
        print('另外一個靜態(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)用普通方法,訪問實例屬性

普通方法和實例屬性都必須通過實例對象去引用,不能直接使用類名去訪問

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

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

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

        # 獲取實例屬性
        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ù) cls 傳遞給類方法

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

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

下面逐一進行說明

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

class Web(object):

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

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

和靜態(tài)方法類似,也可以實例化一個類對象,通過這個對象去調(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"

    # 類方法,第一個參數(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)方法

在一個類方法內(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('另外一個類方法被調(diào)用!')

    # 類方法,第一個參數(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)用普通方法,訪問實例屬性

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

class Web(object):

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

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

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

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

5、子類的使用

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

4.區(qū)別

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

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

5.最后

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

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

    關(guān)注

    6

    文章

    915

    瀏覽量

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

    關(guān)注

    3

    文章

    4237

    瀏覽量

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

    關(guān)注

    1

    文章

    28

    瀏覽量

    14502
  • python
    +關(guān)注

    關(guān)注

    53

    文章

    4753

    瀏覽量

    84076
收藏 人收藏

    評論

    相關(guān)推薦

    動態(tài)庫封裝成python模塊的方法

    之前的文章 將靜態(tài)庫封裝成 python 模塊中講解了如何將靜態(tài)庫封裝成 python 模塊,靜態(tài)庫封裝相對來說還是有點復(fù)雜,今天來介紹下動
    發(fā)表于 07-13 15:24 ?524次閱讀

    Python多重繼承使用方法

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

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

    的下面有屬性和方法??梢詫傩岳斫鉃?b class='flag-5'>靜態(tài)的數(shù)據(jù),將方法理解為動態(tài)的處理函數(shù)。比如,在下面的代碼定義了“學(xué)生”,其中_ _init_ _是
    發(fā)表于 07-30 18:08

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

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

    請問Python方法、實例方法靜態(tài)方法是什么?

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

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

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

    python靜態(tà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 動態(tài)獲取執(zhí)行若把所有的函數(shù)是放在,并定義成靜態(tài)
    發(fā)表于 03-29 17:43

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

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

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

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

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

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

    Python的屬性和方法是什么

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

    Python和對象詳解

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

    java抽象可以有普通方法

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

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

    用 this 關(guān)鍵字時,編譯器會發(fā)出錯誤提示,因為方法靜態(tài)方法,沒有與它們關(guān)聯(lián)的特定對象實例。然而,在特定情況下,我們可以使用 this 關(guān)鍵字在
    的頭像 發(fā)表于 11-28 16:24 ?1099次閱讀