全網最適合入門的物件導向程式設計教程:02 類和物件的 Python 實現-使用 Python 建立類
摘要
本文主要介紹了串列埠通訊協議的基本概念、串列埠通訊的基本流程、如何使用 Python 語言建立一個類和類內成員中屬性和方法的定義。
正文
這裡開始,我們將以嵌入式中常用的串列埠通訊協議為例,講解以下知識:
① 如何在 Python 中建立類和物件;
② 如何為 Python 物件新增屬性和行為;
③ 如何將類組織成包和模組;
④ 如何限制外部訪問私有資料。
在使用 Python 進行程式設計之前,我們先回想一下平時我們是如何使用串列埠的。總結來說,無非就是下面幾個步驟:
① 首先,我們需要確定要使用的串列埠號。
② 其次,配置波特率、資料位、奇偶校驗位、停止位、DTR/DSR、RTS/CTS 和 XON/XOFF。
③ 第三,開啟串列埠。
④ 第四,收發資料。
⑤ 第五,關閉串列埠。
接下來,我們就來研究下用 Python 怎麼實現面對物件的串列埠操作。
在大多數程式語言中,類就是一組用來描述如何生成一個物件的程式碼段,由於 Python 是動態語言,類是動態生成的。透過 class 關鍵字我們可以定義一個新的型別,class 之後為類的名稱並以冒號結尾:
_# 類名必須遵循標準的 Python 變數名準則_
_# 必須以字母或下畫線開頭,並只能由字母、下畫線或數字組成_
_# PEP 8標準建議類名應該用駝峰格式:_
_# 以大寫字母開頭,任意後續單詞都以大寫字母開頭_
class ClassName:
pass
類的定義行後面是類的內容塊。和其他的 Python 程式碼結構一樣,類也用縮排而非其他語言常用的大括號或方括號來界定。Python 中儘量用 4 個空格作為縮排。任何好用的程式碼編輯器都支援將 Tab 鍵輸入替換為 4 個空格。由於示例中第一個類實際上什麼都不做,因此我們簡單地在第 2 行用 pass 關鍵字表示下面沒有進一步的動作了。
class ClassName:
pass
c = ClassName()
print(id(ClassName), type(ClassName), ClassName)
print(id(c), type(c), c)
這裡,我們使用 printf 函式輸出類和例項的相關資訊。需要說明的是,在 Python,所有的資料型別,值,變數,函式,類,例項等等一切可操作的基本單元都使用物件(Object)表示。每個物件有三個基本屬性:ID,型別和值,也即有一塊記憶體中儲存了一個物件,這塊記憶體中一定存有這三個屬性。在以上的輸出中,我們可以看到在 Python 中定義一個新類(Class)等於建立了一個新型別(Type)的物件(Object),直譯器中一切物件均儲存在 PyObject 結構中。
示例中,我們定義了一個自己的型別 ClassName,c 是它的例項(Instance),它的型別是 main.ClassName。Class 和 Type 均是指型別(Type),Class 通常用於普通使用者使用 class 自定義的型別。Type 通常指 Python 的直譯器 CPython 內建的型別。
<__main__.ClassName object at 0x00000281CFD71190>
指明瞭當前例項 c 所處記憶體空間為 0x00000281CFD71190。
這裡,我們首先建立一個串列埠類 SerialClass:
_# 建立一個串列埠類_
class SerialClass:
pass
但可以看到,我們並沒有定義類中任何東西,現在該怎麼操作呢,怎麼實現一個串列埠的收發功能呢?對於一個類而言,一般具有兩個成員:屬性和方法。用來描述具體某個物件的特徵的是屬性,是靜態的,例如串列埠通訊需要設定的一些引數,如波特率、資料位位數等。每個物件有它們自己的行為或者是使用它們的方法,比如串列埠傳送資料、接收資料、設定通訊引數等,我們把這些行為稱之為方法,是動態的,可以使用這些方法來操作一個物件。
關於如何為我們剛剛建立的串列埠類新增屬性和方法,我們下一節會講到。
文件和程式碼獲取
可訪問如下連結進行對文件下載:
https://github.com/leezisheng/Doc
本文件主要介紹如何使用 Python 進行物件導向程式設計,需要讀者對 Python 語法和微控制器開發具有基本瞭解。相比其他講解 Python 物件導向程式設計的部落格或書籍而言,本文件更加詳細、側重於嵌入式上位機應用,以上位機和下位機的常見串列埠資料收發、資料處理、動態圖繪製等為應用例項,同時使用 Sourcetrail 程式碼軟體對程式碼進行視覺化閱讀便於讀者理解。
相關示例程式碼獲取連結如下:https://github.com/leezisheng/Python-OOP-Demo
往期推薦:
學嵌入式的你,還不會物件導向??!
全網最適合入門的物件導向程式設計教程:00 物件導向設計方法導論
全網最適合入門的物件導向程式設計教程:01 物件導向程式設計的基本概念
更多精彩內容可看:
給你的 Python 加加速:一文速通 Python 平行計算
一文搞懂 CM3 微控制器除錯原理
肝了半個月,嵌入式技術棧大彙總出爐
電子計算機類比賽的“武林秘籍”
一個MicroPython的開源專案集錦:awesome-micropython,包含各個方面的Micropython工具庫