chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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)方法、類(lè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 修飾的方法稱(chēng)為:靜態(tài)方法,和普通的函數(shù)沒(méi)有什么區(qū)別

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

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

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


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

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

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

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

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

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

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

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

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

    # 類(lèi)方法
    @classmethod
    def foo_classmethod_other(cls):
        print('類(lèi)方法被調(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)用類(lèi)方法
        print(Web.foo_classmethod_other())

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

普通方法和實(shí)例屬性都必須通過(guò)實(shí)例對(duì)象去引用,不能直接使用類(lèi)名去訪問(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、子類(lèi)的使用

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

class Web(object):

    @staticmethod
    def foo_staticmethod(arg1, arg2):
        pass

class Django(Web):
    """子類(lèi)"""
    pass

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

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

3.@classmethod

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

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

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

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

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

class Web(object):

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

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

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

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

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

  • 「 類(lèi)名.變量名 」
  • 「 cls.變量名 」

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

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

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

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

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

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

class Web(object):

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

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

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

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


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

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

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

class Web(object):

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

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

    # 類(lèi)方法,第一個(gè)參數(shù)為cls,代表類(lèi)本身
    @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、子類(lèi)的使用

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

4.區(qū)別

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

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

5.最后

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

聲明:本文內(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

    文章

    1039

    瀏覽量

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

    關(guān)注

    3

    文章

    4417

    瀏覽量

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

    關(guān)注

    1

    文章

    30

    瀏覽量

    14840
  • python
    +關(guān)注

    關(guān)注

    57

    文章

    4876

    瀏覽量

    90022
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎ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 ?1255次閱讀

    Python多重繼承使用方法

    執(zhí)行父類(lèi)的__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類(lèi)? 優(yōu)勢(shì)有哪些?

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

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

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

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

    Python類(lèi)方法、實(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)方法

    ;)小黑跳起來(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ù)是放在類(lèi),并定義成靜態(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)方法類(lèi)方法詳細(xì)筆記說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是python基礎(chǔ)教程之如何進(jìn)行靜態(tài)方法類(lè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'>類(lèi)</b><b class='flag-5'>方法</b>詳細(xì)筆記說(shuō)明

    python靜態(tài)方法類(lèi)方法

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

    Python類(lèi)的屬性和方法是什么

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

    java抽象類(lèi)可以有普通方法

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

    this可以出現(xiàn)在類(lèi)方法

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

    查看python安裝路徑的方法

    。 方法一:使用Python自帶安裝程序的默認(rèn)路徑 Python的安裝程序通常會(huì)將Python解釋器安裝在默認(rèn)的路徑
    的頭像 發(fā)表于 11-29 14:54 ?1.4w次閱讀