全網最適合入門的物件導向程式設計教程:14 類和物件的 Python 實現-類的靜態方法和類方法,你分得清嗎?

FreakStudio發表於2024-07-11

全網最適合入門的物件導向程式設計教程:14 類和物件的 Python 實現-類的靜態方法和類方法,你分得清嗎?

摘要:

本文主要介紹了Python中類和物件中的類方法和靜態方法,以及類方法和靜態方法的定義、特點、應用場景和使用方法,並對二者進行對比。

原文連結:

FreakStudio 的部落格

往期推薦:

學嵌入式的你,還不會物件導向??!

全網最適合入門的物件導向程式設計教程:00 物件導向設計方法導論

全網最適合入門的物件導向程式設計教程:01 物件導向程式設計的基本概念

全網最適合入門的物件導向程式設計教程:02 類和物件的 Python 實現-使用 Python 建立類

全網最適合入門的物件導向程式設計教程:03 類和物件的 Python 實現-為自定義類新增屬性

全網最適合入門的物件導向程式設計教程:04 類和物件的Python實現-為自定義類新增方法

全網最適合入門的物件導向程式設計教程:05 類和物件的Python實現-PyCharm程式碼標籤

全網最適合入門的物件導向程式設計教程:06 類和物件的Python實現-自定義類的資料封裝

全網最適合入門的物件導向程式設計教程:07 類和物件的Python實現-型別註解

全網最適合入門的物件導向程式設計教程:08 類和物件的Python實現-@property裝飾器

全網最適合入門的物件導向程式設計教程:09 類和物件的Python實現-類之間的關係

全網最適合入門的物件導向程式設計教程:10 類和物件的Python實現-類的繼承和里氏替換原則

全網最適合入門的物件導向程式設計教程:11 類和物件的Python實現-子類呼叫父類方法

全網最適合入門的物件導向程式設計教程:12 類和物件的Python實現-Python使用logging模組輸出程式執行日誌

全網最適合入門的物件導向程式設計教程:13 類和物件的Python實現-視覺化閱讀程式碼神器Sourcetrail的安裝使用

更多精彩內容可看:

給你的 Python 加加速:一文速通 Python 平行計算

一文搞懂 CM3 微控制器除錯原理

肝了半個月,嵌入式技術棧大彙總出爐

電子計算機類比賽的“武林秘籍”

一個MicroPython的開源專案集錦:awesome-micropython,包含各個方面的Micropython工具庫

文件和程式碼獲取:

可訪問如下連結進行對文件下載:

https://github.com/leezisheng/Doc

image

本文件主要介紹如何使用 Python 進行物件導向程式設計,需要讀者對 Python 語法和微控制器開發具有基本瞭解。相比其他講解 Python 物件導向程式設計的部落格或書籍而言,本文件更加詳細、側重於嵌入式上位機應用,以上位機和下位機的常見串列埠資料收發、資料處理、動態圖繪製等為應用例項,同時使用 Sourcetrail 程式碼軟體對程式碼進行視覺化閱讀便於讀者理解。

相關示例程式碼獲取連結如下:https://github.com/leezisheng/Python-OOP-Demo

正文

靜態方法

以 SensorClass 類為例,所謂 InitSensor、StartSensor、StopSensor 等在類中定義的方法都是物件方法,也就是說這些方法都是傳送給物件的訊息,都呼叫了物件中的屬性。實際上,我們寫在類中的方法並不需要都是物件方法,類中有一些方法不需要呼叫物件屬性,就比如在 InitSensor 方法中我們可能需要判斷當前 COM 口是否存在,很顯然這個方法與感測器物件無關。

又比如,我們定義一個“三角形”類,透過傳入三條邊長來構造三角形,並提供計算周長和麵積的方法,但是傳入的三條邊長未必能構造出三角形物件,因此我們可以先寫一個方法來驗證三條邊長是否可以構成三角形,這個方法很顯然就不是物件方法,因為在呼叫這個方法時三角形物件尚未建立出來(因為都不知道三條邊能不能構成三角形),所以這個方法是屬於三角形類而並不屬於三角形物件的。我們可以使用靜態方法來解決這類問題,程式碼如下所示。

@staticmethod
    _# 判斷感測器ID號是否正確:這裡判斷ID號是否在0到99之間_
    def IsTrueID(id:int = 0):
        if id >= 0 and id <= 99:
            return True
        else:
            return False

靜態方法,其實就是我們學過的函式,和函式唯一的區別是,靜態方法定義在類這個空間(類名稱空間)中,而函式則定義在程式所在的空間(全域性名稱空間)中。靜態方法沒有類似 self、cls 這樣的特殊引數,因此 Python 直譯器不會對它包含的引數做任何類或物件的繫結。也正因為如此,類的靜態方法中無法呼叫任何類屬性和類方法。這裡我們定義了 IsPort 靜態方法判斷感測器 ID 號是否正確,靜態方法需要使用@staticmethod 修飾。靜態方法的呼叫,既可以使用類名,也可以使用類物件,例如:

_    # 設定ID號_
    id = 1
_    # 判斷ID號是否符合格式_
    if SensorClass.IsTrueID(id):
        s = SensorClass()
    else:
        print("Sensor Init False")

image

類方法

和靜態方法比較類似,Python 還可以在類中定義類方法,類方法的第一個引數約定名為 cls,它代表的是當前類相關的資訊的物件(類本身也是一個物件,有的地方也稱之為類的後設資料物件),透過這個引數我們可以獲取和類相關的資訊並且可以建立出類的物件,Python 會自動將類本身繫結給 cls 引數(注意,繫結的不是類物件)。也就是說,我們在呼叫類方法時,無需顯式為 cls 引數傳參。

類方法需要使用@classmethod 修飾符進行修飾,我們在 MasterClass 中定義類方法 MasterInfo 示例程式碼如下:

@classmethod
    def MasterInfo(cls):
        print("Info : "+str(cls))

print(MasterClass.MasterInfo())

image

image

相關文章