您好,登錄后才能下訂單哦!
在計算機編程發展之初,解決一個客觀問題的思路往往是通過設計算法
去對數據進行分析處理最終給出結果。
例如:完成一組數據的排序,生成特定的數列
從一組數據中篩選出符合條件的數據等等。
在面向過程的編程中,解決問題是以功能為起點
分析問題主要從**依附在事物上的行為** 出發
面向過程的編程重在 **如何一步步完成這一行為**
例如:顧客購物可以簡要描述為:
顧客進入商店,選擇商品,付錢,離開商店
為什么需要**面向對象**?
但隨著需要解決的問題的規模和復雜度逐漸增加
面向過程的思想在進行程序設計時
需要分析和處理的數據就變得非常龐大
不利于設計者對問題的分析和處理,并且在一定程度上限制了程序的運行效率。
客觀事物描述的時候往往圍繞著 **從中抽象出的主要個體**
例如:購物這一事件圍繞 顧客、店主 和 商品 發生。
在對 **個體** 進行數據分析時,往往可以通過一些 **特性(具有的屬性)和行為(進行的動作)** 進行描述
例如:顧客擁有 現金余額 等屬性,可以實施 購買商品 等行為。
這些獨立的個體都可以進行相應的**數據處理**,相互之間可以進行**信息的傳遞**,作為獨立的通信個體
事實上,客觀事物描述時大多都可以抽象成 **多個獨立對象之間進行信息傳遞和處理** 的類似模型來進行分析。
換句話說,相比面向過程代碼復雜度隨著行為的多變性增加,面向對象的思維在編程時更為通用,獨立對象的行為/屬性變化不會影響其他部分,更不會導致整體需要調整。
在具體問題中,抽象出的有用的對象屬性和行為越具體,描述越精確,抽象出的模型越接近現實情況,具體需要抽象到什么程度,需要根據需求進行分析。
例如:
如果只需要知道顧客購買了什么商品,方便統計數量,可以通過添加商品對象,對其數量進行統計分析即可
但如果還需要進行財務管理,就需要給商品增加價格這一屬性,進一步進行數據處理
盡管面向對象在面對復雜問題時具有較大優勢,面向過程仍為面向對象的基礎
對象的行為如何實施,對象之間的數據傳遞和處理等仍需要面向過程的思想為基礎進行編寫。
類:具有同一類屬性和方法的對象的集合(模板)(類也可看作是一種數據結構)
方法:定義在類中的函數
對象:具有類中屬性和方法的具體的獨立個體,即類的實例化個體
類變量(類屬性):定義在類中(方法外)的變量,類和實例對象通用,可以在外部直接通過類名(對象名).屬性名的形式進行訪問
類對象:類本身也是一個特殊對象,在創建類時,會在內存中存放
實例化:創建一個具體的對象即為類的實例化
繼承:在定義類A時,可以在類名后加(B),其中B也為一個類對象,表示A類擁有B類的屬性和方法,無需重新定義,類似于現實生活中的繼承關系,A類也可在定義中添加自己的屬性和方法。
方法重寫:當繼承父類的方法無法滿足需求時,派生類(子類)可以在類內重寫方法(同名)以滿足需求
基類(父類):A類繼承B類的屬性和方法,則A類就是B類的基類(父類)
派生類(子類):A類繼承B類的屬性和方法,則B類就是A類的派生類(子類)
面向對象的語言將某個個體的屬性和行為進行封裝**(類)**,作為一個獨立的邏輯單元進行分析處理
子類從父類中繼承其屬性及方法,也可在子類中加入新的屬性及方法
相同的 函數或數據 作用或傳遞 到不同的對象中,執行或處理 的結果也不同
class A: # A為類名
variable=0 # 類變量
def __init__(self): # 初始化方法
函數體
def fun(self): # 方法
函數體
a = A # 以類A為模板創建一個名為a的對象
屬性訪問
print (a.variable) # 輸出類變量的值,利用對象名.變量名訪問
方法調用
a.fun() # 調用方法
方法在類中定義時
參數:會強制添加第一個參數并指向類的實例化對象(默認參數名為self,也可自行定義)
調用方式:對象名.方法名()
類方法:利用classmethod裝飾的方法
參數:會強制添加第一個參數并指向類本身(默認參數名為cls,也可自行定義)
調用方式:類名.方法名() 或者 對象名.方法名()
靜態方法 :利用staticmethod裝飾的方法
參數:沒有強制參數,形式上與普通函數無異,只是在類中
調用方法:類名.方法名() 或者 對象名.方法名()
- 方法中self參量指向**實例對象**,類方法中cls參量指向**類本身**,可用于在方法中訪問實例/類中的屬性和方法
- 類自身也是一種特殊的對象
class A: # 定義A類
def fun(self): # 普通方法
...
此處應有at符classmethod
def class_fun(cls): # 類方法
...
此處應有at符staticmethod
def static_fun(): # 靜態方法
...
a = A # 以A為模板創建名為a的對象
a.fun() # 調用普通方法
A.class_fun() # 類名調用類方法
a.class_fun() # 對象名調用類方法
A.static_fun() # 類名調用靜態方法
a.static_fun() # 對象名調用靜態方法
__init__(self):類的初始化方法(構造方法),創建對象時調用
__def__(self): 類的析構方法,釋放對象時調用。
__str__(self):打印,利用print輸出對象時輸出的信息,必須有字符串型的返回值,否則報錯
__repr__(self):效果上和__str__相同,單調用的時機不同
Python2中默認繼承經典類,新式類需要繼承自object
Python3中默認繼承新式類
經典類:
?在多繼承時采用MRO算法,深度優先
?相同父類執行多次構造函數
新式類:
?在多繼承時采用C3算法廣度優先
?相同父類執行一次構造函數
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。