從面向過程到面向?qū)ο?/h3>面向過程
在計算機編程發(fā)展之初,解決一個客觀問題的思路往往是通過設(shè)計算法
去對數(shù)據(jù)進行分析處理最終給出結(jié)果。
例如:完成一組數(shù)據(jù)的排序,生成特定的數(shù)列
從一組數(shù)據(jù)中篩選出符合條件的數(shù)據(jù)等等。
在面向過程的編程中,解決問題是以功能為起點
分析問題主要從**依附在事物上的行為** 出發(fā)
面向過程的編程重在 **如何一步步完成這一行為**
例如:顧客購物可以簡要描述為:
顧客進入商店,選擇商品,付錢,離開商店
為什么需要**面向?qū)ο?*?
但隨著需要解決的問題的規(guī)模和復(fù)雜度逐漸增加
面向過程的思想在進行程序設(shè)計時
需要分析和處理的數(shù)據(jù)就變得非常龐大
不利于設(shè)計者對問題的分析和處理,并且在一定程度上限制了程序的運行效率。
面向?qū)ο蟮乃季S
客觀事物描述的時候往往圍繞著 **從中抽象出的主要個體**
例如:購物這一事件圍繞 顧客、店主 和 商品 發(fā)生。
在對 **個體** 進行數(shù)據(jù)分析時,往往可以通過一些 **特性(具有的屬性)和行為(進行的動作)** 進行描述
例如:顧客擁有 現(xiàn)金余額 等屬性,可以實施 購買商品 等行為。
這些獨立的個體都可以進行相應(yīng)的**數(shù)據(jù)處理**,相互之間可以進行**信息的傳遞**,作為獨立的通信個體
事實上,客觀事物描述時大多都可以抽象成 **多個獨立對象之間進行信息傳遞和處理** 的類似模型來進行分析。
換句話說,相比面向過程代碼復(fù)雜度隨著行為的多變性增加,面向?qū)ο蟮乃季S在編程時更為通用,獨立對象的行為/屬性變化不會影響其他部分,更不會導(dǎo)致整體需要調(diào)整。
在具體問題中,抽象出的有用的對象屬性和行為越具體,描述越精確,抽象出的模型越接近現(xiàn)實情況,具體需要抽象到什么程度,需要根據(jù)需求進行分析。
例如:
如果只需要知道顧客購買了什么商品,方便統(tǒng)計數(shù)量,可以通過添加商品對象,對其數(shù)量進行統(tǒng)計分析即可
但如果還需要進行財務(wù)管理,就需要給商品增加價格這一屬性,進一步進行數(shù)據(jù)處理
面向?qū)ο蠛兔嫦蜻^程的關(guān)系
盡管面向?qū)ο笤诿鎸?fù)雜問題時具有較大優(yōu)勢,面向過程仍為面向?qū)ο蟮幕A(chǔ)
對象的行為如何實施,對象之間的數(shù)據(jù)傳遞和處理等仍需要面向過程的思想為基礎(chǔ)進行編寫。
面向?qū)ο缶幊讨械幕靖拍?個人理解)
類:具有同一類屬性和方法的對象的集合(模板)(類也可看作是一種數(shù)據(jù)結(jié)構(gòu))
方法:定義在類中的函數(shù)
對象:具有類中屬性和方法的具體的獨立個體,即類的實例化個體
類變量(類屬性):定義在類中(方法外)的變量,類和實例對象通用,可以在外部直接通過類名(對象名).屬性名的形式進行訪問
類對象:類本身也是一個特殊對象,在創(chuàng)建類時,會在內(nèi)存中存放
實例化:創(chuàng)建一個具體的對象即為類的實例化
繼承:在定義類A時,可以在類名后加(B),其中B也為一個類對象,表示A類擁有B類的屬性和方法,無需重新定義,類似于現(xiàn)實生活中的繼承關(guān)系,A類也可在定義中添加自己的屬性和方法。
方法重寫:當(dāng)繼承父類的方法無法滿足需求時,派生類(子類)可以在類內(nèi)重寫方法(同名)以滿足需求
基類(父類):A類繼承B類的屬性和方法,則A類就是B類的基類(父類)
派生類(子類):A類繼承B類的屬性和方法,則B類就是A類的派生類(子類)
面向?qū)ο蟮娜筇匦?相比面向過程)
封裝
面向?qū)ο蟮恼Z言將某個個體的屬性和行為進行封裝**(類)**,作為一個獨立的邏輯單元進行分析處理
繼承
子類從父類中繼承其屬性及方法,也可在子類中加入新的屬性及方法
多態(tài)
相同的 函數(shù)或數(shù)據(jù) 作用或傳遞 到不同的對象中,執(zhí)行或處理 的結(jié)果也不同
類
類的定義
class A: # A為類名
variable=0 # 類變量
def __init__(self): # 初始化方法
函數(shù)體
def fun(self): # 方法
函數(shù)體
類的實例化(利用類創(chuàng)建對象)
a = A # 以類A為模板創(chuàng)建一個名為a的對象
屬性訪問
print (a.variable) # 輸出類變量的值,利用對象名.變量名訪問
方法調(diào)用
a.fun() # 調(diào)用方法
方法:
普通方法:
方法在類中定義時
參數(shù):會強制添加第一個參數(shù)并指向類的實例化對象(默認參數(shù)名為self,也可自行定義)
調(diào)用方式:對象名.方法名()
類方法:
類方法:利用classmethod裝飾的方法
參數(shù):會強制添加第一個參數(shù)并指向類本身(默認參數(shù)名為cls,也可自行定義)
調(diào)用方式:類名.方法名() 或者 對象名.方法名()
靜態(tài)方法 :
靜態(tài)方法 :利用staticmethod裝飾的方法
參數(shù):沒有強制參數(shù),形式上與普通函數(shù)無異,只是在類中
調(diào)用方法:類名.方法名() 或者 對象名.方法名()
注:
- 方法中self參量指向**實例對象**,類方法中cls參量指向**類本身**,可用于在方法中訪問實例/類中的屬性和方法
- 類自身也是一種特殊的對象
例:
class A: # 定義A類
def fun(self): # 普通方法
...
此處應(yīng)有at符classmethod
def class_fun(cls): # 類方法
...
此處應(yīng)有at符staticmethod
def static_fun(): # 靜態(tài)方法
...
a = A # 以A為模板創(chuàng)建名為a的對象
a.fun() # 調(diào)用普通方法
A.class_fun() # 類名調(diào)用類方法
a.class_fun() # 對象名調(diào)用類方法
A.static_fun() # 類名調(diào)用靜態(tài)方法
a.static_fun() # 對象名調(diào)用靜態(tài)方法
類的特殊方法:
__init__(self):類的初始化方法(構(gòu)造方法),創(chuàng)建對象時調(diào)用
__def__(self): 類的析構(gòu)方法,釋放對象時調(diào)用。
__str__(self):打印,利用print輸出對象時輸出的信息,必須有字符串型的返回值,否則報錯
__repr__(self):效果上和__str__相同,單調(diào)用的時機不同
新式類和經(jīng)典類(舊式類)
Python2中默認繼承經(jīng)典類,新式類需要繼承自object
Python3中默認繼承新式類
經(jīng)典類:
?在多繼承時采用MRO算法,深度優(yōu)先
?相同父類執(zhí)行多次構(gòu)造函數(shù)
新式類:
?在多繼承時采用C3算法廣度優(yōu)先
?相同父類執(zhí)行一次構(gòu)造函數(shù)
網(wǎng)頁名稱:Python基礎(chǔ)【面向?qū)ο蟆?
鏈接地址:http://weahome.cn/article/ipeoss.html