1. 程式人生 > >python中的面向物件(簡單類的建立以及內建方法,私有屬性和私有方法的使用)

python中的面向物件(簡單類的建立以及內建方法,私有屬性和私有方法的使用)

一、什麼面向物件和麵向過程?

面向物件:--誰來做?
相比較函式,面向物件是更大的封裝,根據職責在一個物件中封裝多個方法
1.在完成某一個需求前,首先確定職責--要做的事(方法)
2.根據職責確定不同的物件,在物件內部封裝不同的方法(多個)
3.最後完成程式碼,就是順序的讓不同的物件呼叫不同的方法
特點:
1.注重物件和職責,不同的物件承擔不同的職責
2.更加適合對複雜的需求變化,是專門應對複雜專案的開發,提供的固定套路
3.需要在面向過程的基礎上,再學習一些面向物件的語法
主要是針對的是一個物件,將所有的功能封裝成一個物件,讓對
象去實現具體的細節,這就好比,我們想要吃一個蛋糕,將製作蛋糕的原材
料封裝後交給蛋糕房,讓蛋糕房來生產蛋糕。 優點:解決了程式的擴充套件性,對某一個資訊的修改比較容易,然後反映到這 個體系中。 缺點:可控性差,面向物件的程式一旦開始就由物件之間的互動解決問題,無法預測最終結果。 面向過程:側重於怎麼做? 1.把完成某一個需求的 所有步驟 從頭到尾 逐步實現 2.根據開發要求,將某些功能獨立的程式碼封裝成一個又一個函式 3.最後完成的程式碼,就是順序的呼叫不同的函式 特點: 1.注重步驟與過程,不注重職責分工 2.如果需求複雜,程式碼會變得很複雜 3.開發複雜專案,沒有固定的套路,開發難度很大 主要針對的是一個過程,將程式分為具體的步驟,哪個步驟該執 行什麼樣的事情,在這個步驟裡應該注意哪個細節。例如,我們拿到製作蛋
糕的原材料時自己按著流水線的步驟來做,一旦其中一個步驟出現錯誤,那 麼就無法完成。 優點:極大的降低了程式的複雜性 缺點:可用性差,一個流水線或者流程只能解決一個問題。

二、類的建立及物件的建立

1、建立一個類時候,需要滿足的三個要求
(1)、類名:這類事物的總稱,滿足大駝峰命名方法
(2)、屬性:這類事物具有的特徵
(3)、這類事物具有什麼樣的行為

例子1、簡單的類和物件定義

面向物件的基礎用法:
1.基本類的定義
class 類名:
def 方法1(self,引數列表):
pass
def 方法2(self,引數列表):
pass
2.當一個類定義完成之後,要使用這個類來建立物件
語法格式如下:
物件變數 = 類名()
物件變數.方法1()
物件變數.方法2()

例項

在日常開發中,不推薦在類的外部給物件增加屬性
如果在執行時,沒有找到屬性,程式會報錯
這裡寫圖片描述
結果證明
這裡寫圖片描述

例子2:地址id

在python中,一切皆為物件,每個物件會產生三個屬性,id,數值(value),型別type
這裡需要注意的是地址相同時,數值一定相同,而地址不同時,數值可相同,也可不同
這裡寫圖片描述

例子3:一個類中定義兩個物件,兩個物件的地址不同,若將物件傳遞給另一個物件時,地址仍然保持不變

這裡寫圖片描述
結果證明
這裡寫圖片描述

三、方法

1、初始化方法

我們現在已經知道了使用 類名() 就可以建立一個物件
當使用類名()建立物件時,python的直譯器會自動執行以下操作:
1.為物件在記憶體中分配空間–建立物件
2.呼叫初始化方法為物件的屬性設定初始值–初始化方法(init)
這個初始化方法就是init方法,init是物件的內建方法
init方法是專門用來定義一個類具有哪些屬性的方法
class Cat():
def init(self):
print ‘這是一個初始化方法’
# self.屬性名 = 屬性的初始值
self.name = ‘Tom’
#print ‘hello’

使用 類名() 建立物件的時候,會自動呼叫初始化方法 init
tom = Cat()
print tom.name

例子

這裡寫圖片描述
1、改造初始化方法–初始化的同時設定初始值:
在開發中,如果希望在建立物件的同時,就設定物件的屬性,可以對init方法進行改造
1.把希望設定的屬性值,定義成init方法的引數
2.在方法內部使用self.屬性名 = 形參 接收外部傳遞的引數
3.在建立物件時,使用類名(屬性1,屬性2..)呼叫

2、在初始化方法的內部定義屬性
init方法內部使用self.屬性名 = 屬性的初始值 就可以定義

2、del方法(內建方法)

當刪除一個物件時,python直譯器會預設呼叫一個方法,這個方法為_ del _ ()方法。當一個物件被從記憶體中銷燬前,會被自動呼叫_del方法Python的記憶體管理機制能夠很好的勝任這份工作。也就是說,不管是手動呼叫 del 還是由 python自動回收都會觸發 del _ 方法執行:

例項

這裡寫圖片描述
結果顯示
當我們建立完物件時,會被自動呼叫,刪除物件時,del方法會被呼叫,若不刪除物件,那麼會先執行其他的命令,在呼叫del方法
這裡寫圖片描述

3、str方法(內建方法)

在python中,使用python輸出物件變數,預設情況下,會輸出這個變數引用的物件,由哪一個類建立的物件,以及記憶體中的地址(十六進位制),如果在開發中,希望使用print 輸出物件變數時,能夠列印自定義的內容,就可以使用str這個內建方法了

例項:

這裡寫圖片描述
結果證明
這裡寫圖片描述

4、類的屬性和方法(類屬性,類方法,私有屬性,私有方法,靜態方法)

類的結構

例項:
1.使用面向物件開發,第一步是設計類
2.使用 類名() 建立物件,建立物件的動作有兩步
1.在記憶體中為物件分配空間
2.呼叫初始化方法init_ 為物件初始化
3.物件建立後,記憶體中就有了一個物件的實實在在的存在–例項

因此:
1.創建出來的物件叫做類的例項
2.建立物件的動作叫做例項化
3.物件的屬性叫做例項屬性
4.物件呼叫的方法叫做例項方法

在程式執行時:
1.物件各自擁有自己的例項屬性
2.呼叫物件的方法,可以通過self
訪問自己的屬性
呼叫自己的方法
結論:
1.每一個物件都有自己獨立的記憶體空間,儲存各自不同的屬性
2.多個物件的方法,在記憶體中之有一份,在呼叫方法時,需要把物件的引用傳遞到方法內部

例項1

類是一個特殊的物件
Python中一切皆物件
class AAA: 定義的類屬性屬於類物件
obj1 =AAA: 屬於例項物件
在執行程式時,類 同樣會被載入到記憶體
在python中,類 是一個特殊的物件–類物件

除了封裝 例項(物件) 的屬性和方法外,類物件還可以有自己的屬性和方法

通過 類名. 的方式可以直接訪問類的屬性或者呼叫類的方法
這裡寫圖片描述
結果顯示
這裡寫圖片描述

例項2

類屬性就是針對類物件定義的屬性
使用賦值語句在class關鍵字下方可以定義類屬性
類屬性用於記錄於這個類相關的特性

類方法就是針對類物件定義的方法
在類方法內部就可以直接訪問類屬性或者呼叫其他類方法
語法如下:
@classmethod
def 類方法(cls):
pass
這裡寫圖片描述
這裡寫圖片描述
結果顯示
這裡寫圖片描述

例項3

靜態方法
在開發時,如果需要在類中封裝一個方法,這個方法:
既不需要訪問例項屬性或者呼叫例項方法
也不需要訪問類屬性或者呼叫類方法
這個時候可以把這個方法封裝成一個靜態方法

語法如下:
@staticmethod
def 靜態方法():
pass
靜態方法需要修飾器@staticmethod來標識,告訴直譯器這是一個靜態方法
通過類名,呼叫靜態方法
這裡寫圖片描述
結果顯示
這裡寫圖片描述

例項4:綜合應用

1.設計一個Game類
2.屬性
類屬性,記錄遊戲的歷史最高分(與這個遊戲類有關係,與每次遊戲無關)
例項屬性,記錄當前遊戲玩家的玩家姓名
3.方法:
靜態方法:方法show_help顯示遊戲幫助資訊
類方法:方法show_top_score顯示歷史最高分
例項方法:方法start_game開始當前玩家的遊戲

4.主程式步驟
1.檢視幫助資訊
2.檢視歷史最高分
3.建立遊戲物件,開始遊戲
這裡寫圖片描述
這裡寫圖片描述
結果顯示
這裡寫圖片描述

例項5:私有屬性和方法

在定義屬性或方法時,在屬性名或者方法名前增加兩個下劃線,定義的就是私有屬

父類的私有屬性和私有方法
1.子類物件不能在自己的方法內部,直接訪問父親的私有屬性和私有方法
2.子類物件可以通過父類的公有方法間接訪問到私有屬性和私有方法
私有屬性,私有方法是物件的隱私,不對外公開,外界和子類不能直接訪問
私有屬性,私有方法常用做一些內部的事情
這裡寫圖片描述
這裡寫圖片描述
結果顯示
這裡寫圖片描述
想要對私有方法進行呼叫,可以在類中定義公有方法,通過公有方法間接呼叫私有方法

四、新式類和舊式類

Python中類分兩種:舊式類和新式類:
新式類,舊式類(經典類)
新式類 定義時給類後加上(object)
class A(object)
pass
python 3 以後若是未指定繼承自object 會預設繼承自 object 類
python 3 以前則不會,需要進行指定,
可通過 dir()函式,來檢視經典類多繼承搜尋順序(深度優先):

注:新式類舊式類最明顯的區別在於繼承搜尋的順序發生了改變
即:
經典類多繼承搜尋順序(深度優先):
先深入繼承樹左側查詢,然後再返回,開始查詢右側
新式類多繼承搜尋順序(廣度優先):
先在水平方向查詢,然後再向上查詢。
此種區別會在面向物件特點——繼承中介紹到

例項1

這裡寫圖片描述
結果顯示
這裡寫圖片描述

例項2、 new()方法

_ new _ ()方法是在類準備將自身例項化時呼叫。
_ new _ ()方法始終都是類的靜態方法,即使沒有被加上靜態方法裝飾器。
第一種例子
這裡寫圖片描述
結果顯示
這裡寫圖片描述
第二個例子
這裡寫圖片描述
這裡寫圖片描述
結果顯示
這裡寫圖片描述