全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?2 類和對(duì)象的Python實(shí)現(xiàn)-使用Python創(chuàng)建類
全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?2 類和對(duì)象的 Python 實(shí)現(xiàn)-使用 Python 創(chuàng)建類
摘要
本文主要介紹了串口通信協(xié)議的基本概念、串口通信的基本流程、如何使用 Python 語言創(chuàng)建一個(gè)類和類內(nèi)成員中屬性和方法的定義。
正文
這里開始,我們將以嵌入式中常用的串口通信協(xié)議為例,講解以下知識(shí):
① 如何在 Python 中創(chuàng)建類和對(duì)象;
② 如何為 Python 對(duì)象添加屬性和行為;
③ 如何將類組織成包和模塊;
④ 如何限制外部訪問私有數(shù)據(jù)。
在使用 Python 進(jìn)行編程之前,我們先回想一下平時(shí)我們是如何使用串口的。總結(jié)來說,無非就是下面幾個(gè)步驟:
① 首先,我們需要確定要使用的串口號(hào)。
② 其次,配置波特率、數(shù)據(jù)位、奇偶校驗(yàn)位、停止位、DTR/DSR、RTS/CTS 和 XON/XOFF。
③ 第三,打開串口。
④ 第四,收發(fā)數(shù)據(jù)。
⑤ 第五,關(guān)閉串口。
接下來,我們就來研究下用 Python 怎么實(shí)現(xiàn)面對(duì)對(duì)象的串口操作。
在大多數(shù)編程語言中,類就是一組用來描述如何生成一個(gè)對(duì)象的代碼段,由于 Python 是動(dòng)態(tài)語言,類是動(dòng)態(tài)生成的。通過 class 關(guān)鍵字我們可以定義一個(gè)新的類型,class 之后為類的名稱并以冒號(hào)結(jié)尾:
_# 類名必須遵循標(biāo)準(zhǔn)的 Python 變量名準(zhǔn)則_
_# 必須以字母或下畫線開頭,并只能由字母、下畫線或數(shù)字組成_
_# PEP 8標(biāo)準(zhǔn)建議類名應(yīng)該用駝峰格式:_
_# 以大寫字母開頭,任意后續(xù)單詞都以大寫字母開頭_
class ClassName:
pass
類的定義行后面是類的內(nèi)容塊。和其他的 Python 代碼結(jié)構(gòu)一樣,類也用縮進(jìn)而非其他語言常用的大括號(hào)或方括號(hào)來界定。Python 中盡量用 4 個(gè)空格作為縮進(jìn)。任何好用的代碼編輯器都支持將 Tab 鍵輸入替換為 4 個(gè)空格。由于示例中第一個(gè)類實(shí)際上什么都不做,因此我們簡(jiǎn)單地在第 2 行用 pass 關(guān)鍵字表示下面沒有進(jìn)一步的動(dòng)作了。
class ClassName:
pass
c = ClassName()
print(id(ClassName), type(ClassName), ClassName)
print(id(c), type(c), c)

這里,我們使用 printf 函數(shù)輸出類和實(shí)例的相關(guān)信息。需要說明的是,在 Python,所有的數(shù)據(jù)類型,值,變量,函數(shù),類,實(shí)例等等一切可操作的基本單元都使用對(duì)象(Object)表示。每個(gè)對(duì)象有三個(gè)基本屬性:ID,類型和值,也即有一塊內(nèi)存中存儲(chǔ)了一個(gè)對(duì)象,這塊內(nèi)存中一定存有這三個(gè)屬性。在以上的輸出中,我們可以看到在 Python 中定義一個(gè)新類(Class)等于創(chuàng)建了一個(gè)新類型(Type)的對(duì)象(Object),解釋器中一切對(duì)象均存儲(chǔ)在 PyObject 結(jié)構(gòu)中。
示例中,我們定義了一個(gè)自己的類型 ClassName,c 是它的實(shí)例(Instance),它的類型是 main.ClassName。Class 和 Type 均是指類型(Type),Class 通常用于普通用戶使用 class 自定義的類型。Type 通常指 Python 的解釋器 CPython 內(nèi)置的類型。
<__main__.ClassName object at 0x00000281CFD71190>
指明了當(dāng)前實(shí)例 c 所處內(nèi)存空間為 0x00000281CFD71190。
這里,我們首先創(chuàng)建一個(gè)串口類 SerialClass:
_# 創(chuàng)建一個(gè)串口類_
class SerialClass:
pass
但可以看到,我們并沒有定義類中任何東西,現(xiàn)在該怎么操作呢,怎么實(shí)現(xiàn)一個(gè)串口的收發(fā)功能呢?對(duì)于一個(gè)類而言,一般具有兩個(gè)成員:屬性和方法。用來描述具體某個(gè)對(duì)象的特征的是屬性,是靜態(tài)的,例如串口通信需要設(shè)置的一些參數(shù),如波特率、數(shù)據(jù)位位數(shù)等。每個(gè)對(duì)象有它們自己的行為或者是使用它們的方法,比如串口發(fā)送數(shù)據(jù)、接收數(shù)據(jù)、設(shè)置通信參數(shù)等,我們把這些行為稱之為方法,是動(dòng)態(tài)的,可以使用這些方法來操作一個(gè)對(duì)象。
關(guān)于如何為我們剛剛創(chuàng)建的串口類添加屬性和方法,我們下一節(jié)會(huì)講到。
文檔和代碼獲取
可訪問如下鏈接進(jìn)行對(duì)文檔下載:
https://github.com/leezisheng/Doc

本文檔主要介紹如何使用 Python 進(jìn)行面向?qū)ο缶幊蹋枰x者對(duì) Python 語法和單片機(jī)開發(fā)具有基本了解。相比其他講解 Python 面向?qū)ο缶幊痰牟┛突驎裕疚臋n更加詳細(xì)、側(cè)重于嵌入式上位機(jī)應(yīng)用,以上位機(jī)和下位機(jī)的常見串口數(shù)據(jù)收發(fā)、數(shù)據(jù)處理、動(dòng)態(tài)圖繪制等為應(yīng)用實(shí)例,同時(shí)使用 Sourcetrail 代碼軟件對(duì)代碼進(jìn)行可視化閱讀便于讀者理解。
相關(guān)示例代碼獲取鏈接如下:https://github.com/leezisheng/Python-OOP-Demo

往期推薦:
學(xué)嵌入式的你,還不會(huì)面向?qū)ο螅浚浚?/strong>
全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?0 面向?qū)ο笤O(shè)計(jì)方法導(dǎo)論
全網(wǎng)最適合入門的面向?qū)ο缶幊探坛蹋?1 面向?qū)ο缶幊痰幕靖拍?/strong>
更多精彩內(nèi)容可看:
給你的 Python 加加速:一文速通 Python 并行計(jì)算
一個(gè)MicroPython的開源項(xiàng)目集錦:awesome-micropython,包含各個(gè)方面的Micropython工具庫

本文主要介紹了串口通信協(xié)議的基本概念、串口通信的基本流程、如何使用 Python 語言創(chuàng)建一個(gè)類和類內(nèi)成員中屬性和方法的定義。
浙公網(wǎng)安備 33010602011771號(hào)