本文主要介紹了串口通信協議的基本概念、串口通信的基本流程、如何使用 Python 語言創建一個類和類內成員中屬性和方法的定義。 ...
全網最適合入門的面向對象編程教程: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 並行計算
一個MicroPython的開源項目集錦:awesome-micropython,包含各個方面的Micropython工具庫