使用類別和變數將 OOP 模型轉換成程式碼
您想要透過建置猜拳的遊戲,評估物件導向程式設計 (OOP)。 若要這樣做,您必須先使用 OOP 格式建立模型。
我們必須運用一些基本的 OOP 概念,例如類別、物件和狀態。 本單元將探討下列部分:
- 重要的 OOP 概念:若要理解 OOP,您必須了解一些基本概念,例如類別、物件和狀態。 您必須知道其彼此之間的差異,以及彼此之間的關係。
- OOP 中的變數:您必須知道如何處理變數,以及如何將變數新增至物件。
什麼是物件?
在嘗試模型化問題定義域的過程中,我們已數次提及物件的概念。 物件是執行者。 其在是在系統內進行了某些事。 因為採取了某個動作,所以其變更了本身或其他物件的狀態。
讓我們想像一下現實世界中的某個物件。 您在停車場中可以觀察到什麼? 可能會看到很多形狀、大小和顏色不同的車輛。 您可使用製造商、型號、顏色和汽車類型等屬性來描述汽車。 當將值指派給這些屬性時,就可以快速清楚指出您說的是紅色法拉利、四輪驅動吉普車,還是黃色的福特野馬等。
在另一個場景中,想像拉斯維加斯的一副撲克牌。 您看到兩張不同的牌,這是兩個物件。 您知道其有一些共同的屬性,亦即花色。 這些物件的花色可以是梅花、紅心、方塊或黑桃。 其值可以是 A、K、9 等。
提示
看看週遭環境。 找兩個類似的物件,例如兩本書或兩把椅子,看看能否找出最能描述又能區分二者的屬性。
什麼是類別?
類別是一種資料類型,可作為特定物件種類的範本定義。
您已了解 OOP 系統有物件,而這些物件有屬性。 有一個與物件類似的概念,即類別。
那麼,什麼是類別? 類別是物件的藍圖。 當類別是汽車的藍圖時,物件就是您駕駛的實際車輛。 類別是您使用程式碼所撰寫的內容。 當告訴執行階段環境執行程式碼時,得到的結果就是物件。
下表是一些類別及其產生的物件範例:
類別 | Object |
---|---|
汽車的藍圖 | Honda Accord, Jeep Wrangler |
貓 | 加菲貓 |
霜淇淋的描述 | 草莓、巧克力或香草 |
您依據類別建立物件的方式,就像是依據藍圖打造出一部汽車。 建立物件時,程式會向作業系統要求資源 (也就是記憶體),才能夠建構物件。 相對地,依據藍圖打造汽車時,工廠也會要求金屬、橡膠和玻璃等資源來組合汽車。
建立類別
使用關鍵字 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
與兩個變數 make
和 floor
。 此處有關程式碼的重要重點為:__init__()
以隱含方式呼叫。 您不會依名稱來呼叫 __init__()
方法,但在建立物件時會透過這行程式碼來呼叫:
elevator = Elevator(1)
self
的不正確用法
若要強調參數 self
的運作方式,請考量使用下列程式碼,該程式碼會在建構函式 __init__()
中指派屬性 color
及 make
:
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
如果目標是要讓 color
和 make
屬性成為類別 Car
,您必須修改程式碼。 請確定在建構函式中兩個屬性都已指派到 self
,如下所示:
self.color = "Red" # ends up on the object
self.make = "Mercedes"
提示
作為在家練習,請嘗試從您要閱讀的書籍建立類別。 思考一下要如何撰寫其類別,以及應該具備哪些屬性。