目錄
一.面向對象
二.面向對象概述
三.類與對象
一.面向對象
Python中的面向對象編程OOP是一種編程范式,它使用對象來設計軟件。對象是具有屬性(稱為屬性)和可以執行的操作(稱為方法)的數據結構。
基礎概念
類: | 類是創建對象的藍圖或模板。它為對象提供了初始狀態 |
對象: | 對象是類的實例。它由類實例化而成,具體實現了類中定義的行為。 |
屬性: | 屬性是保存在對象中的數據,代表了對象的狀態。 |
方法: | 方法是定義在類中的函數,能夠對對象進行操作或計算。 |
繼承: | 繼承是一種機制,它允許一個類繼承另一個類的屬性和方法,從而促進代碼的復用。 |
封裝: | 封裝是將對象的實現細節隱藏起來,只暴露有限的接口供外部訪問。 |
多態: | 多態是對象根據引用類型或繼承的實體展現出不同的形態。 |
使用場景
1. 建模真實世界的問題:?
- 當問題可以以物體、實體或者具有明確層次結構的事物表示時,OOP特別有用,比如管理人員、汽車、賬戶等。
2. 軟件設計和架構:?
- 大型軟件項目通常劃分為多個互相協作的模塊。OOP使得通過定義清晰的類和對象來組織這些模塊成為可能。
3. 游戲開發:
- 游戲中的角色、道具等都可作為對象來處理,每個對象有其屬性和行為,易于管理和拓展。
4. 用戶界面設計:
- 用戶界面組件,如按鈕、窗口和菜單項等,很自然地映射為對象,每個對象有其方法進行響應和處理用戶的操作。
5. Web應用開發:?
- 如Django和Flask,使用OOP實現模型(Model)、視圖(View)、控制器(Controller)(MVC)或模型(Model)、視圖(View)、模板(Template)(MVT)模式。
6. 代碼復用和組織:?
- 通過創建一個基礎類,其他相關的子類可以繼承并重用代碼,減少冗余,并有助于維護。
面向對象編程提供了一種清晰的方式來組織復雜的代碼結構,使得大型項目的維護和協作變得更為容易。其主要優勢是提高了代碼的可讀性、可擴展性和可維護性。在設計初期,使用OOP進行系統設計能夠幫助開發者更直觀地理解問題,并且更好地進行模塊和功能的劃分。
二.面向對象概述
需求
編寫一個程序,完成一名學生的信息輸出
- 定義學生的姓名與年齡
- 打印信息
使用面向過程的方式實現
# 遍歷打印所有姓名-年齡
def print_info(names_temp, ages_temp):print("姓名:", names_temp, " 年齡:", ages_temp)# 定義一個變量存儲姓名
name = "小明"
# 定義一個變量存儲年齡
age = 20# 遍歷姓名-年齡
print_info(name, age)
分析
從上述通過面向過程方式實現的代碼中,我們可以發現代碼行數不是很多,整個程序比較簡單。
但是上面的代碼雖然看上去簡單,實際上如果我們想要進行升級功能則不見得容易,例如:我們需要在上述的代碼基礎上修改并實現三名同學的信息存儲,那么應該怎么辦呢?看看下面的方式是否可行?有什么不好的地方?
# 遍歷打印所有姓名-年齡
def print_info(names_temp, ages_temp):print("姓名:", names_temp, " 年齡:", ages_temp)# 定義第1個人的信息,然后輸出
name = "小明"
age = 20
print_info(name, age)# 定義第2個人的信息,然后輸出
name = "雙雙"
age = 22
print_info(name, age)# 定義第3個人的信息,然后輸出
name = "安娜"
age = 23
print_info(name, age)
下面對代碼進行優化:
# 遍歷打印所有姓名-年齡
def print_info(names_temp, ages_temp):print("姓名:", names_temp, " 年齡:", ages_temp)# 定義第1個人的信息,然后輸出
names = ["小明", "雙雙", "安娜"]
ages = [20, 22, 23]
print_info(names[0], ages[0])
print_info(names[1], ages[1])
print_info(names[2], ages[2])
上面我們使用了列表進行了升級,避免了定義多個變量的問題。但是你是否有這樣的感覺,即便是升級了總感覺還是不夠好。如果有這種感覺就對了,因為上面的這種方式就是面向過程開發,這種開發模式就是一步步的對需要的數據以及方法進行操作。因此出現代碼亂的情況,在所難免。
使用面向對象的方式實現
下面代碼是使用面向對象開發模式,實現一名同學的信息輸出:
class Person:def __init__(self, name, age):self.name = nameself.age = age# 遍歷打印所有姓名-年齡def print_info(self):print("姓名:", self.name, " 年齡:", self.age)# 創建一個對象
p = Person("小明", 20)
p.print_info()按照這個思路,如果想要創建三個人呢?見如下代碼:按照這個思路,如果想要創建三個人呢?見如下代碼:
# 創建另外2個對象
p2 = Person("雙雙", 22)
p2.print_info()
p3 = Person("安娜", 23)
p3.print_info()
上述代碼第十二行代碼中定義了一個Person類的變量p讓這它指向一個對象,在這個對象中有name、age以及打印信息的功能代碼(本節僅僅是引出面向對象的好處,詳細的對象等知識接下來詳細講解),這樣一來想要表示一個人就創建一個Person類的對象即可,如果不看第1~10行,只看第12~13行的話,就會有一種感覺:原來模擬創建一個人只需要這么簡單的代碼
面向過程與面向對象的對比分析
通過上述兩種代碼的實現方式(面向過程、面向對象)我們能夠的粗以下幾個結論:
- 面向過程:根據業務邏輯從上到下寫代碼
- 面向對象:將數據與函數綁定到一起,進行封裝,這樣能夠更快速的開發程序,減少了重復代碼的重寫過程
- 面向過程編程最易被初學者接受,其往往用一長段代碼來實現指定功能,開發過程的思路是將數據與函數按照執行的邏輯順序組織在一起,數據與函數分開考慮。
簡單總結
面向對象編程(Object Oriented Programming-OOP) 是一種解決軟件復用的設計和編程方法。
這種方法把軟件系統中相近相似的操作邏輯、操作應用數據和狀態用類的型式描述出來,以對象實例的形式在軟件系統中復用,以達到提高軟件開發效率的作用。
簡單來說:面向對象能實現的功能,面向過程也能實現,往往程序的代碼量都比較大,如果用面向過程的方式實現則代碼冗余且不已升級,使用面向對象將數據與功能進行封裝在中大程序開發中首先考慮使用。
三.類與對象
對象是面向對象編程的核心,在使用對象的過程中,為了將具有共同特征和行為的一組對象抽象定義,提出了另外一個新的概念:類
- 類,就相當于制造飛機時的圖紙,想象成模具
- 對象,就相當于創建的飛機,想象成通過模具制造出的物品
相關概念
類
人以類聚,物以群分。具有相似內部狀態和運動規律的實體的集合(或統稱為抽象)。 具有相同屬性和行為事物的統稱
類是抽象的,在使用的時候通常會找到這個類的一個具體的存在,并使用這個具體的存在,一個類可以找到多個對象。
示例:
class Person:def __init__(self, name, age):self.name = nameself.age = age# 遍歷打印所有姓名-年齡def print_info(self):print("姓名:", self.name, " 年齡:", self.age)
對象
某一個具體事物的存在 ,在現實世界中可以是看得見摸得著的。可以是直接使用的
示例:
Person("安娜", 20) # 執行完之后返回值就是對象的引用
類與對象的關系
先有類,通過類創建對象
用一個生活中的例子來說明:某公司在簽署某個合同時往往需要在文件中蓋章,在紙質合同上的印章圖案就是對象,那么印章就是類。
一句話說明:類是模板,對象是類這個模板生產出來的具體的產品。
類的構成
類class由三個部分組成:
- 類的名稱:類名
- 類的屬性:一組數據
- 類的方法:允許對進行操作的方法 (行為)
示例:
如何創建人物對象
- 事物名稱(類名):人(Person)
- 屬性:身高(height)、年齡(age)
- 方法(行為/功能):跑(run)、打架(fight)
如何創建狗類對象
- 類名:狗(Dog)
- 屬性:品種 、毛色、性別、名字、 腿兒的數量
- 方法(行為/功能):叫 、跑、咬人、吃、搖尾巴