官术网_书友最值得收藏!

3.7 類和對象

類(class),類似函數,是位于主體代碼外的另一部分代碼,只有當在主體代碼中被調用時才開始執行。對象(object)是其所對應的類的實例(instance),存在于主體代碼中。為了更好地理解類,可以把類想成一個藍圖,例如,汽車的藍圖。它包含了汽車某些零部件的外觀以及怎樣與別的零部件協同工作的信息。Python中的類就是像這樣的關于某些東西的藍圖。

你可以把對象看作基于藍圖構建出的實際的東西。例如一個真實的、可以工作的無人駕駛汽車就是一個對象的例子。一般你會先創造出車的藍圖(這就是類),然后基于藍圖構建一輛車(這就是對象)。當然,如果你有了一個東西的藍圖,你就可以不停地基于同一藍圖造車,比如說,你可以建造一條生產線用于批量生產汽車。

為了讓你對類的概念理解得更加深入,我們來創建一個簡單的機器人的示例。可以像這樣創建一個類:

我們使用class關鍵詞表明正在創建一個新的名為Bot的類。接下來,至關重要的一步是編寫__init__()方法,這一步在創建類時是不可或缺的。只要這個類的一個對象在主體代碼中被創建出來,這個函數就會自動被調用。

類里面的所有函數都需要將self作為一個參數。那么,self是什么呢?self參數指明了這個函數和函數中以self為開始的變量都屬于這個類的實例,也就是對象。一旦有了類的對象,我們就可以使用self中的變量。本例中Bot類的__init__()方法還使用了另外兩個參數,posx和posy,這是我們即將創建的機器人的初始位置。

我們還創建了一個通過增減posx和posy來使機器人移動的方法(method)。“方法”指的是嵌套在類里面的函數。你可以把它看作藍圖中決定事物該如何運作的指令。例如,我們再次回到汽車的案例,方法可以定義引擎或者變速箱運作的方式。

現在,你可以創建這個類的一個對象了。記住,它是基于藍圖(類)構建出的實際的東西。

之前,類雖然被定義了,但是不會隨著別的代碼的運行而執行。在你創建了一個對象之后,類就變為主體代碼中的一個組成部分。我們可以通過這樣做來實現它:

這樣做會創建Bot類的一個新對象,我們將這一新對象命名為bot。在創建時,我們必須指明Bot類中__init__()方法須要納入的兩個參數posx和posy。這是必填的。當創建一個對象時,你通常必須得聲明__init__()方法中定義的所有參數。

現在,在主體代碼中,你可以移動機器人并且顯示它的新位置,像這樣:

在第一行代碼中,我們使用了Bot類中的move方法。你可以從它的定義看出,move采用了兩個變量。這兩個變量分別表明了posx和posy將要增加多少。然后我們僅僅顯示了新的posx和posy的值。這里正是是self發揮作用的地方,如果Bot類中變量posx和posy之前沒有加self,我們就不能在print()方法獲取到這兩個參數。運行這一代碼會得到以下結果:

你可以從結果中看出,我們的機器人在x軸方向向前移動了兩個單位并且在y軸方向向后移動了一個單位。別忘了posx的初始位置為3,現在通過Bot類中的move方法增加了2;posy初始位置為4,而現在通過同樣的move方法增加了1。

花時間來寫Bot類的一大好處就是,我們現在可以創建任意數量的Bot類對象,而不用重復寫類中已經定義好的代碼。簡單地說,對象是類的實體,我們可以用類創建任意數量的對象。總的來說,你可以把類看作一些預定義指令和封裝在類里面的方法的合集,可以把對象想成這個類的一個實例,它在我們的代碼中是可訪問的,并且與代碼一同運行。

練習

你的終極挑戰是創建一個非常簡單的汽車的類。關于參數,汽車的對象應該將汽車所能移動的最大速度(單位為m/s)以及汽車在加速過程中的加速度(單位為m/s2)納入其中。我再增加一點挑戰,即創建一個方法用來計算汽車從當前速度加速到最大速度所花費的時間,加速度已知(使用當前速度作為這個方法的參數)。

提示:要計算所需要的時間,你可以使用以下公式。

其中:

·t——達到最大速度所需要的時間

·Vmax——最大速度

·Vcurrent——當前速度

·a——加速度

本練習的答案可以在GitHub頁面的Chapter 03/Classes/homework.py文件中找到。

主站蜘蛛池模板: 汕头市| 铁力市| 南汇区| 昌平区| 安远县| 深圳市| 监利县| 县级市| 武邑县| 磴口县| 化隆| 行唐县| 汉沽区| 肃北| 那坡县| 清涧县| 廊坊市| 榕江县| 鹤山市| 太原市| 革吉县| 安岳县| 光泽县| 兴隆县| 咸丰县| 奉新县| 金坛市| 泾源县| 郯城县| 濉溪县| 合阳县| 汤阴县| 泗洪县| 贵阳市| 汪清县| 康定县| 隆林| 福鼎市| 郧西县| 永福县| 临夏县|