面向對象??
1. 面向對象和面向過程思想
面向對象和面向過程都是一種編程思想,就是解決問題的思路
- 面向過程:
POP(Procedure Oriented Programming)
面向過程語言代表是c語言 - 面向對象:
OOP(Object Oriented Programming)
常見的面向對象語言包括:java c++ go python koltin
通過面向對象的方式,我們不再關注具體的步驟,而是將問題抽象為對象和它們之間的交互。我們可以直接調用對象的方法來實現功能,而無需顯式指定每個步驟。
面向過程強調按照步驟執行操作,而面向對象強調通過定義和操作對象來解決問題。
在面向對象的編程中,我們將問題抽象為對象的集合,這些對象具有屬性和行為,并通過對象之間的交互來實現功能。這種抽象和交互的方式使得面向對象編程更加靈活、可維護和可擴展。
接下來我們看同一個問題,面向過程和面向對象是怎么解決的?
1.1. 面向過程編程的貪吃蛇游戲
在面向過程編程中,貪吃蛇游戲可能會以以下方式實現:
- 定義蛇的初始位置、長度、方向等變量。
- 創建一個表示游戲區域的二維數組。
- 在游戲循環中,根據用戶輸入改變蛇的方向。
- 更新蛇的位置,根據當前方向向前移動一格。
- 檢查蛇是否吃到食物,如果是,則增加蛇的長度。
- 檢查蛇是否撞到邊界或自己的身體,如果是,則游戲結束。
- 在游戲區域中繪制蛇和食物。
- 循環回到第3步,直到游戲結束。
在面向過程的編程中,游戲的各個方面被劃分為一系列的步驟和變量,通過按照特定順序執行這些步驟來控制游戲的邏輯和狀態。
1.2. 面向對象編程的貪吃蛇游戲
現在,讓我們看看如何使用面向對象編程來實現貪吃蛇游戲。
- 創建一個
Snake
類,具有屬性(例如位置、顏色、長度、方向)和方法(例如移動、吃食物)。 - 創建一個
Food
類,具有屬性(例如位置、顏色)。 - 創建一個
Game
類,它包含一個或多個蛇對象和一個或多個食物對象,以及游戲區域等屬性。Game類還具有控制游戲邏輯的方法,例如更新游戲狀態和繪制游戲界面。 - 在游戲循環中,通過調用Game類的方法來控制游戲的進行,例如根據用戶輸入改變蛇的方向,更新蛇的位置,檢查碰撞等。
- 在游戲界面中,通過調用繪圖方法來繪制蛇和食物。
在面向對象編程中,貪吃蛇游戲被視為一組對象的交互。各個對象封裝了游戲的狀態和行為,并通過對象之間的消息傳遞來實現功能。這種對【對象Object】的抽象和交互使得游戲邏輯更清晰、可維護性更高,并且可以輕松地擴展和修改游戲的功能。
一切皆對象!
1.3. 面向對象的總結
- 面向對象,強調的是對象(實體)
- 面向對象是一種思想,更加符合人的思維習慣
- 面向對象使復雜的問題簡單化了
- 面向對象的出現,讓曾經在過程的執行者,變成了對象的指揮者
2. 類和對象
類和對象是面向對象非常重要的概念
- 類是描述了一種類型(相當于圖紙)
- 對象是這個類型的具體實現(相當于圖紙具體實現)
思考:
旺財和狗,哪個是類,哪個是對象?
答案:
狗是一個類型,屬于類
旺財是狗的實現,屬于對象
類和對象的關系
類就是制造圖紙,只有一個。對象是類的實體,會產生多個
定義類和創建對象
類的定義格式:
class 類名:pass
創建對象
對象名 = 類名()
代碼演示:
# 定義類
class Person:pass
# 創建對象
p1 = Person()
3. 類的組成
類可以描述世間萬物,類都需要有類名,也應該具備一些屬性和行為
- 類的關鍵字:
class
- 類的名稱:類名
- 類的屬性:一組數據
- 類的方法:允許進行操作的方法(行為)
人(Person)類應該具備什么屬性和行為呢?
- 屬性:姓名(
name
) 、年紀(age
) - 方法:吃(
eat
)、跑(run
)、說話(say
)
3.1. 成員屬性
成員屬性的定義需要在初始化方法__init__
方法下定義
格式:
def __init__(self):self.屬性 = 屬性值
舉例:
class Person:def __init__(self, name, age):# 成員屬性self.name = nameself.age = age# 創建對象
p = Person('張三', 30)
# 訪問成員屬性
print(p.name)
print(p.age)
在創建對象時,屬性值可以由外部傳進來,也可以在初始化方法里設置為任意值
3.2. 成員方法
成員方法的定義格式為 def 函數名(self):
class Person:# 定義成員方法 say_hellodef say_hello(self):print('hello')# 定義成員方法rundef run(self):print('跑')# 創建對象
p = Person()
# 調用成員方法
p.say_hello()
注意:
成員方法都會默認有參數self
,調用的時候不需要傳遞self