使用類別和變數將 OOP 模型轉換成程式碼

已完成

您想要透過建置猜拳的遊戲,評估物件導向程式設計 (OOP)。 若要這樣做,您必須先使用 OOP 格式建立模型。

我們必須運用一些基本的 OOP 概念,例如類別、物件和狀態。 本單元將探討下列部分:

  • 重要的 OOP 概念:若要理解 OOP,您必須了解一些基本概念,例如類別、物件和狀態。 您必須知道其彼此之間的差異,以及彼此之間的關係。
  • OOP 中的變數:您必須知道如何處理變數,以及如何將變數新增至物件。

什麼是物件?

在嘗試模型化問題定義域的過程中,我們已數次提及物件的概念。 物件是執行者。 其在是在系統內進行了某些事。 因為採取了某個動作,所以其變更了本身或其他物件的狀態。

讓我們想像一下現實世界中的某個物件。 您在停車場中可以觀察到什麼? 可能會看到很多形狀、大小和顏色不同的車輛。 您可使用製造商、型號、顏色和汽車類型等屬性來描述汽車。 當將值指派給這些屬性時,就可以快速清楚指出您說的是紅色法拉利、四輪驅動吉普車,還是黃色的福特野馬等。

Illustration that shows a car object with the properties type and color.

在另一個場景中,想像拉斯維加斯的一副撲克牌。 您看到兩張不同的牌,這是兩個物件。 您知道其有一些共同的屬性,亦即花色。 這些物件的花色可以是梅花、紅心、方塊或黑桃。 其值可以是 A、K、9 等。

提示

看看週遭環境。 找兩個類似的物件,例如兩本書或兩把椅子,看看能否找出最能描述又能區分二者的屬性。

什麼是類別?

類別是一種資料類型,可作為特定物件種類的範本定義。

您已了解 OOP 系統有物件,而這些物件有屬性。 有一個與物件類似的概念,即類別。

那麼,什麼是類別? 類別是物件的藍圖。 當類別是汽車的藍圖時,物件就是您駕駛的實際車輛。 類別是您使用程式碼所撰寫的內容。 當告訴執行階段環境執行程式碼時,得到的結果就是物件。

下表是一些類別及其產生的物件範例:

類別 Object
汽車的藍圖 Honda Accord, Jeep Wrangler
加菲貓
霜淇淋的描述 草莓、巧克力或香草

您依據類別建立物件的方式,就像是依據藍圖打造出一部汽車。 建立物件時,程式會向作業系統要求資源 (也就是記憶體),才能夠建構物件。 相對地,依據藍圖打造汽車時,工廠也會要求金屬、橡膠和玻璃等資源來組合汽車。

Illustration showing the resource inputs required to assemble a car from a blueprint.

建立類別

使用關鍵字 class 建立的 Python 類別,並為其提供名稱,如下列範例所示:

class Car:

從類別建立物件

在依據類別建立物件時,會視為將其具現化。 您需要使用此範本 (類別) 和這些起始值,要求作業系統提供足夠的記憶體給您,並建立物件。 基本上,具現化就是指建立。

若要將物件具現化,須在類別名稱中加上括弧。 您會取得可選擇用於指派給變數的物件,如下所示:

car = Car()

car 是用於保留物件的執行個體的變數。 您呼叫 Car() 時,就是進行具現化或建立物件的時機。

OOP 中的變數與程序性程式設計中的變數

在程序性程式設計過程中,您已習慣使用變數來保留資訊並追蹤狀態。 您可以在檔案中任何需要的地方定義這些變數。 一般變數初始化如下所示:

pi = 3.14

OOP 也有變數,不過這些變數附加在物件上,而非自行定義。 您可將物件的變數作為屬性參考。 將屬性附加到物件時,會使用下列兩種方式之一:

  • 描述物件:舉一個描述的例子,變數就像是汽車的色彩,或長頸鹿身上的斑點數目。
  • 保留狀態:變數可用於代替描述物件的狀態。 狀態就像是電梯所在的樓層,或電梯是否正在運作。

將屬性新增至類別

建立模型時,也必須了解要新增何種屬性 (變數) 至類別。 您已了解如何在程式碼中建立類別,那麼您要如何在其中新增屬性? 將物件具現化時,必須告訴類別其在進行建構時應具有哪些屬性。 在建立時會呼叫一個名為建構函式的特殊函式。

建構函式

許多程式語言都有所謂建構函式的概念,這是只有在第一次建立物件時才會叫用的特殊函式。 只會呼叫此建構函式一次。 您會在本方法中建立物件應有的屬性。 此外,您還可以將任何起始值指派給建立的屬性。

在 Python 中,其名稱為 __init__()。 您也必須將特殊參數 self 傳遞至建構函式。 參數 self 會參考物件的執行個體。 任何對此關鍵字的指派,皆表示該屬性最後會出現在物件的執行個體上。 如果您未將屬性新增至 self,則系統會將其視為暫時性變數,在 __init__() 完成執行之後將不復存在。

注意

系統也會將參數 self 傳遞至需要參考物件執行個體上相關資訊的所有方法中。 下一個單元將涵蓋此概念。

在類別上新增及初始化屬性

讓我們來觀看一個在建構函式中設定屬性的範例:

class Elevator:
    def __init__(self, starting_floor):
        self.make = "The elevator company"
        self.floor = starting_floor

# To create the object

elevator = Elevator(1)
print(elevator.make) # "The Elevator company"
print(elevator.floor) # 1

上述範例描述類別 Elevator 與兩個變數 makefloor。 此處有關程式碼的重要重點為:__init__() 以隱含方式呼叫。 您不會依名稱來呼叫 __init__() 方法,但在建立物件時會透過這行程式碼來呼叫:

elevator = Elevator(1)

self 的不正確用法

若要強調參數 self 的運作方式,請考量使用下列程式碼,該程式碼會在建構函式 __init__() 中指派屬性 colormake

class Car:
    def __init__():
        self.color = "Red" # ends up on the object
        make = "Mercedes" # becomes a local variable in the constructor

car = Car()
print(car.color) # "Red"
print(car.make) # would result in an error, `make` does not exist on the object

如果目標是要讓 colormake 屬性成為類別 Car,您必須修改程式碼。 請確定在建構函式中兩個屬性都已指派到 self,如下所示:

self.color = "Red" # ends up on the object
self.make = "Mercedes"

提示

作為在家練習,請嘗試從您要閱讀的書籍建立類別。 思考一下要如何撰寫其類別,以及應該具備哪些屬性。