全網最適合入門的面向對象編程教程:14 類和對象的 Python 實現-類的靜態方法和類方法,你分得清嗎?
摘要:
本文主要介紹了Python中類和對象中的類方法和靜態方法,以及類方法和靜態方法的定義、特點、應用場景和使用方法,并對二者進行對比。
原文鏈接:
FreakStudio 的博客
往期推薦:
可能是全網最適合入門的面向對象編程教程:Python實現-嵌入式愛好者必看!
全網最適合入門的面向對象編程教程: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 的安裝使用
更多精彩內容可看:
CM3調試系統簡析
肝了半個月,嵌入式技術棧大匯總出爐
比賽獲獎的武林秘籍:05 電子計算機類比賽國獎隊伍技術如何分工和學習內容
比賽獲獎的武林秘籍:04 電子類比賽嵌入式開發快速必看的上手指南
比賽獲獎的武林秘籍:03 好的創意選取-獲得國獎的最必要前提
比賽獲獎的武林秘籍:02 國獎秘籍-大學生電子計算機類競賽快速上手的流程,小白必看
比賽獲獎的武林秘籍:01 如何看待當代大學生競賽中“卷”“祖傳老項目”“找關系”的現象?
比賽獲獎的武林秘籍:00 學科競賽-工科類大學生繞不開的話題,你了解多少?
電子計算機類比賽的“武林秘籍”-電賽光電設計大賽計算機設計大賽嵌入式芯片與系統設計競賽,你要的都在這里!
文檔和代碼獲取:
可訪問如下鏈接進行對文檔下載:
https://github.com/leezisheng/Doc
本文檔主要介紹如何使用 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 Trueelse:return False
靜態方法,其實就是我們學過的函數,和函數唯一的區別是,靜態方法定義在類這個空間(類命名空間)中,而函數則定義在程序所在的空間(全局命名空間)中。靜態方法沒有類似 self、cls 這樣的特殊參數,因此 Python 解釋器不會對它包含的參數做任何類或對象的綁定。也正因為如此,類的靜態方法中無法調用任何類屬性和類方法。這里我們定義了 IsPort 靜態方法判斷傳感器 ID 號是否正確,靜態方法需要使用@staticmethod 修飾。靜態方法的調用,既可以使用類名,也可以使用類對象,例如:
_ # 設置ID號_id = 1
_ # 判斷ID號是否符合格式_if SensorClass.IsTrueID(id):s = SensorClass()else:print("Sensor Init False")
類方法
和靜態方法比較類似,Python 還可以在類中定義類方法,類方法的第一個參數約定名為 cls,它代表的是當前類相關的信息的對象(類本身也是一個對象,有的地方也稱之為類的元數據對象),通過這個參數我們可以獲取和類相關的信息并且可以創建出類的對象,Python 會自動將類本身綁定給 cls 參數(注意,綁定的不是類對象)。也就是說,我們在調用類方法時,無需顯式為 cls 參數傳參。
類方法需要使用@classmethod 修飾符進行修飾,我們在 MasterClass 中定義類方法 MasterInfo 示例代碼如下:
@classmethoddef MasterInfo(cls):print("Info : "+str(cls))print(MasterClass.MasterInfo())