目錄:
創作不易,各位看官,點個贊收藏、關注必回關、QAQ、您的點贊是我更新的最大動力!
一、面向對象介紹
(一)什麼是面向對象
面向對象編程(Object Oriented Programming,OOP,面向對象程序設計)的主要思想是 把構成問題的各個事物分解成各個對象,建立對象的目的不是爲了完成一個步驟,而是爲了 描敘一個事物在整個解決問題的步驟中的行爲 |
(二)面向過程和麪向對象
面向過程和麪向對象都是軟件開發行業中的編程思想,在軟件開發歷程中都扮演了非常 重要的角色,面向過程編程思想最直觀的實現方式就是函數式編程,面向對象的最直觀的實 現方式是類和對象 |
面向過程就是分析出解決問題所需要的步驟,然後用函數把這些步驟一步一步實現,使 用的時候一個一個依次調用就可以解決問題。面向對象是把構成問題的事物分解成各個對象, 通過對象的行爲之間的互相關聯解決問題,同時抽取的對象本身都是獨立的,可以擴展出更 多的實現。面向過程和麪向對象最直觀的理解如下圖所示: |
(三)面向對象的優勢
面向對象和麪向過程不同的是,將構成問題的各個事物抽象出來作爲單獨的對象,此時 每個對象的行爲就不再侷限於解決固定問題的某個步驟了,而是可以讓對象的行爲適用於任 何一個可以起到作用的地方,這樣做的結果就是軟件的功能得到了非常好的擴展 |
二、類和對象
(一)術語解釋
- 面向對象程序設計(Object Oriented Programming)中的概念主要包括:對象、類、屬性、 方法、封裝、繼承、多態、消息傳遞。通過這些概念面向對象的思想得到了具體的體現
1、對象(object)
生活中有一句話,萬物皆對象,對象就是生活中客觀存在的實際物體,也被稱爲實體,實體
對象,實例,實例對象。
2、類(class)
類其實就是類型的簡稱,描述的是不同的數據類型,生活中還是那句話:萬物皆對象,各種
事物分門別類,描述生活中的不同類型的事物,就是類
3、屬性(Attribute)
生活中的實體物體,都是包含自己的特徵的,如人包含姓名、性別、年齡、膚色特徵(名詞),
電腦包含顏色、尺寸、CPU、內存特徵,課程包含名稱,時長,週期特徵。
屬性就是對象的特徵(名詞)。
4、方法(Method)
生活中的實體物體,都是包含具體的行爲的,如人包含喫飯睡覺打豆豆…行爲,電腦包含開 機、關機、播放、遊戲、辦公行爲,課程包含信息傳播行爲。
方法就是對象的行爲(動詞)。
5、其它(other)
面向對象中還會涉及到封裝、繼承、多態、數據綁定、消息通信等等,具體的概念和應 用都會在後續的章節中進行詳細解讀
(二)類型聲明
類和對象是計算機編程語言中的用於描述事物的載體。它們的關係是,對象是類的實例, 類是對象的模板。如下圖所示:
(三)類型聲明
類型聲明是面向對象程序設計開發的第一個環節,本節內容通過基本語法、命名規範先 瞭解類型的基本建模方式,再分析在項目案例中怎麼分析和構建符合需求的類型
1、基本語法
Python 編程語言的語法提供了 class 關鍵字,用於類型的聲明,基本語法如下:
2、聲明規範
Python 編程語言相比較其他編程語言,爲了簡化編碼制定了更加嚴格的語法規則,並 且在軟件開發過程中通過開發規範進行約束
① 類型名稱:標識符(字母、數字、下劃線組成,數字不能開頭)
帕斯卡命名法(大駝峯命名法):一個或者多個單詞組成,每個單詞首字母大寫
② 屬性特徵:就是一個變量,必須和 self 一起使用;
遵循變量的命名規則[見名知意、下劃線命名法]
③ 方法行爲:就是一個函數,遵循函數的命名規則[見名知意、下劃線命名法]
- 類型命名規範
類型名稱是一種標識符,由英文字母、數字和下劃線組成,數字不能開頭。項目開發規 範要求類型名稱要做到見名知意,使用帕斯卡命名法
帕斯卡命名法,某些資料中也稱爲大駝峯命名法,是由一個或者多個單詞組成,每個大 單詞的首字母大寫,如:UserInformation、Consumer,Goods 等等 |
- 屬性名稱規範
屬性,本質上就是一個普通的變量,聲明在類型中用於描述類型的一個特徵數據,所以 屬性名稱的規範和變量的命名規範一致,做到見名知意,優先推薦下劃線命名法,或者使用 駝峯命名法
駝峯命名法,某些資料中也稱爲小駝峯命名法,是由一個或者多個單詞組成,第一個單 詞全部小寫,後面每個大單詞的首字母大寫,如:userGender、userType 等等 |
- 方法名稱規範
方法,本質上就是在類型中聲明的函數(類型賦予了方法更多的功能),所以方法名稱的 命名規範和函數的命名規範一致,做到見名知意,優先推薦下劃線命名法,或者使用駝峯命 名法 |
- 其它規範
類型在標準開發規範的約束下,要求在類型聲明內部第一行必須包含文檔註釋,描述類 型的作用,在類型內部先聲明屬性,再聲明方法,不同的方法之間分隔一個空行 |
- 類型的聲明案例
下面的代碼中,聲明瞭一個普通的用戶類型,類型包含賬號、密碼、暱稱屬性,包含保 存、刪除的方法 |
class User:
"""用戶類型"""
def __init__(self,username,password,nickname):
"""記錄用戶屬性"""
print("開始執行對象初始化")
self.username = username
self.password = password
self.nickname = nickname
def save(self):
"""保存方法"""
pass
def delete(self):
"""刪除方法"""
print("執行刪除操作")
(四)面向對象設計開發
面向對象程序設計開發,是一種成熟的程序設計開發方式,有固定的開發步驟,通常包 含如下四個環節:
面向對象分析(OOA:Object-Oriented Analysis) | 從用戶需求出發,分析項目中需要解決的問題,抽象項目中的功能和互相依賴 的關係,確定功能開發過程中的限制條件 |
面向對象設計(OOD:Object-Oriented Design) | 根據分析得到的具體的問題,抽取參與解決問題的對象 |
面向對象編程(OOP:Object-Oriented Programming) | |
編程對象測試(OOT:Object-Oriented Testing) |
軟件從開發到交付的完整示意流程,如下圖所示:
1、項目分析
以個人博客項目爲例進行面向對象的分析及開發,個人博客是以信息共享和社交 爲目的經典軟件產品,首先針對個人博客的功能進行分解,如圖所示:
項目中需要的功能,就是我們需要解決的問題,根據面向對象的設計原則,簡要分析實 現上述功能需要參與的對象,如圖所示:
2、聲明類型
根據項目分析,我們需要創建項目中需要的類型,首先創建項目並構建項目結構,項目 名稱爲:blog,項目中定義類型的模塊爲:model.py,初始項目結構如下圖所示:
三、實例屬性和方法
類型作爲一種事物的描述,需要同時描述事物的特徵和他們所具備的行爲,描述特徵數 據的就是實例屬性,描述行爲的就是實例方法,如下圖所示超級英雄類型中,就可以抽取所 有超級英雄共有的特徵和行爲,並將這些特徵和行爲聲明在超級英雄類型中表現出來(一)基本語法
實例屬性,是類型中用於描述每個對象具體數據的,在類型聲明過程中,將實例屬性聲 明在__init__()方法中,通過接受傳遞的參數數據進行數據初始化,基本語法如下:
class User:
"""用戶類型"""
def __init__(self,username,password,nickname):
"""記錄用戶屬性"""
print("開始執行對象初始化")
self.username = username
self.password = password
self.nickname = nickname
實例方法,是類型中描述每個對象的行爲操作的,通過函數語法進行體現,將對象的行 爲函數聲明在類型的內部,稱爲類型的實例方法,基本語法如下:
class User:
"""用戶類型"""
def __init__(self,username,password,nickname):
"""記錄用戶屬性"""
print("開始執行對象初始化")
self.username = username
self.password = password
self.nickname = nickname
def save(self):
"""保存方法"""
pass
def delete(self):
"""刪除方法"""
print("執行刪除操作")
(二)self關鍵字
類型中的方法,第一個參數都是 self,self 關鍵字用於描述當前對象自身,類似生活中” 我”這個名詞一樣,通過 self 可以在實例方法中獲取到當前對象自身的所有實例屬性和實例 方法
self 關鍵字主要用於描述當前對象,聲明在方法的第一個位置參數上,是一個變量,所以可 以修改成任意單詞來表示,但是約定俗稱使用 self 這個單詞 |
(三)實例操作
個人博客項目中,我們已經根據功能涉及的對象抽取了作者類型和文章類型,根據我們 在項目中的操作方式,就可以爲所有的作者聲明他們共有的屬性和方法了,文章亦如此
根據分析得到的結果,按照類型聲明的語法,完善作者類型的實例屬性和實例方法,操 作代碼如下:
四、構造方法
面向對象程序設計開發中,對象是具體包含處理數據的實體,通過類型創建對象並使用 對象的實例屬性和實例方法,是開發必須掌握的一個環節(一)創建對象語法
通過聲明的類型,可以創建該類型對應的具體對象,基本語法如下:
創建對象時就可以將數據通過參數傳遞給__init__()方法完成屬性的初始化,並 將創建好的對象的地址存儲在 user 變量中,通過 user 變量可以找到或者引用到創建的對象, 所以稱 user 變量爲對象的引用變量
(二)對象屬性和方法
創建對象是爲了使用對象的屬性和方法,在語法中可以通過對象的引用變量來獲取對象 並操作對象的屬性和方法
1、對象的實例屬性
2、對象的實例方法
(三)、對象的創建過程
程序都是運行在計算機內存中的,對象的創建也是在程序申請的內存空間中完成的,在 對象構建過程中,主要經歷了申請空間、創建對象、屬性初始化的過程
運行程序,就可以看到在創建對象時,解釋器自動調用了__new__(cls)創建對象,調用 init(self)初始化數據的過程
通過代碼進行演示,可以看到解釋器構建對象的過程:
# - 申請空間-->創建對象-->屬性初始化
#
# - 類名(),準備創建對象,申請內存空間-->調用`__new__`()方法,創建對象-->
# 調用`__init__`()方法,對象初始化-->將創建好的對象賦值給"="左邊的變量
class User:
"""用戶類型"""
def __init__(self,username):
"""記錄用戶屬性"""
print("對象初始化操作")
self.username = username
def __new__(cls, *args, **kwargs):
"""創建對象"""
print("開始創建對象")
return object.__new__(cls)
user = User("穩穩")
五、對象的打印和開發
(一)對象的打印
通過對象的創建過程瞭解到,對象一旦創建完成,是將對象在內存中的地址臨時存儲在 引用變量中的,這樣通過引用變量才能訪問到對象,所以在程序中直接打印可以找到對象的 引用變量時,就會得到引用變量中存儲的內存地址數據
class User:
"""用戶類型"""
def __init__(self,username,password,nickname):
"""記錄用戶屬性"""
self.username = username
self.password = password
self.nickname = nickname
def save(self):
"""保存方法"""
pass
def delete(self):
"""刪除方法"""
print("執行刪除操作")
# 創建user對象,會自動執行__init__()方法
user = User("穩穩","123","C9")
print(user)
print(id(user))
(二)str()和repr()
項目中直接訪問對象,就會獲取到對象的內存地址,對於項目的開發人員來說,更多的 時候關注的是對象本身的數據,打印對象直接獲取對象內部關鍵數據是一種非常直觀並且非
1、str()
#可以通過 對象名.屬性名 查看屬性值,但是當屬性比較多時,查看屬性就不太方便
#打印對象時,會自動調用__str__()方法
class User:
"""用戶類型"""
def __init__(self,username,password,nickname):
"""記錄用戶屬性"""
self.username = username
self.password = password
self.nickname = nickname
def __str__(self):
print("--str--")
# return "123"
return f"{self.username} {self.password} {self.nickname}"
user = User("穩穩","123","C9")
#打印對象會自動執行__str__()方法
print(user)
print([user])
2、repr()
class User:
"""用戶類型"""
def __init__(self,username,password,nickname):
"""記錄用戶屬性"""
self.username = username
self.password = password
self.nickname = nickname
# def __str__(self):
# print("--str--")
# return f"{self.username} {self.password} {self.nickname}"
def __repr__(self):
print("--repr--")
return f"{self.username} {self.password} {self.nickname}"
user = User("穩穩","123","C9")
#打印對象會自動執行__str__()方法,如果沒有此方法,會尋找__repr__()方法
print(user)
print([user])
class Student:
"""學生類"""
def __init__(self,name,age):
"""初始化屬性"""
self.name = name #stu1.name="穩穩"
self.age = age
def __str__(self):
"""自我介紹的方法"""
return (f"我叫{self.name},今年{self.age}歲,請多多關照!")
stu1 = Student("穩穩",20)
print(stu1)
六、案例練習說明
1、老張開車去東北[函數式]
# 老張開車去東北
#
# ```
# 需求:發動車輛,輸入姓名,車型,到達的目的地(面向過程)
# 定義車輛發動函數,駕駛函數,到達目的地函數
# ```
import time
def start():
"""駕駛員"""
name = input("請輸入姓名:")
print("用戶:",name)
#調用車輛駕駛函數
driver(name)
def driver(name):
"""駕駛"""
car = input("請輸入車的型號")
print(f"{name}駕駛{car},準備出發。。。")
area = input("請輸入要到達的目的地")
#調用到達目的地函數
run(area)
def run(area):
"""車行駛到達目的地"""
for i in range(10):
time.sleep(0.5)
print("->",end='')
print("經過跋山涉水,到達目的地",area)
# start()
2、老張開車去東北[面向對象]
# 面向對象開車
# 老張開車去東北
# """
# 人類
# 屬性:姓名,年齡,性別
# 方法:開車 (傳遞一個車對象,直接調用車行駛的方法,不需要關係車是如何行駛的)
# 車類
# 屬性:品牌,顏色
# 方法:行駛
# 地點類
# 屬性:省市縣
# """
class Person:
"""人的類型"""
def __init__(self,name,age,gender):
"""屬性初始化方法"""
self.name = name
self.age = age
self.gender = gender
def driver(self,car):
"""開車,人的行爲"""
print(f"{self.name}準備出發")
#調用車對行駛的方法
car.run("東北")
class Car:
def __init__(self,brand,color):
"""屬性初始化方法"""
self.brand = brand
self.color = color
def run(self,area):
print(f"{self.color}的{self.brand}發動了,準備去{area}")
# #創建出所有參數問題的對象
per1 = Person("老張",50,"男")
qirui = Car("瑞虎5x","灰色")
per1.driver(qirui)
#
# aodi = Car("奧迪A6","白色")
# per2 = Person("老王",45,"男")
# per2.driver(aodi)
3、文章發表
#發表文章練習
"""
文章有標題,作者,內容,可以保存,數據保存在類屬性中
數據類型:可以保存數據
文章類型:
屬性:標題,作者,內容
方法:保存
"""
class Database:
"""數據類型"""
#保存文章的類屬性
article_dict = {}
class Article:
def __init__(self,title,author,content):
"""實例屬性初始化"""
self.title = title
self.author = author
self.content = content
def save(self):
"""保存文章數據"""
#字典根據鍵保存值的方法 self是當前文章對象
Database.article_dict[self.title] = self
#發表文章
title = input("請輸入文章標題:")
author = input("請輸入文章作者:")
content = input("請輸入文章內容:")
#創建文章對象
article = Article(title,author,content)
#保存文章
article.save()
#查看文章數據
for title,article in Database.article_dict.items():
print(f"標題:{title}\n文章內容:{article.content}")