面向对象初识
一、面向對象(OOP)基本概念
面向對象編程?——?Object Oriented Programming?簡寫?OOP
1.1 過程和函數
-
過程?是早期的一個編程概念
-
過程?類似于函數,只能執行,但是沒有返回值
-
函數?不僅能執行,還可以返回結果
?
1.2 面相過程和面相對象基本概念
(1)面相過程?——?怎么做?
把完成某一個需求的所有步驟從頭到尾逐步實現
根據開發需求,將某些功能獨立的代碼封裝成一個又一個函數
最后完成的代碼,就是順序地調用?不同的函數
特點
注重步驟與過程,不注重職責分工
如果需求復雜,代碼會變得很復雜
開發復雜項目,沒有固定的套路,開發難度很大!
(2)?面向對象?——?誰來做?
相比較函數,面向對象是更大的封裝,根據職責在一個對象中封裝多個方法
在完成某一個需求前,首先確定職責?——?要做的事情(方法)
根據職責確定不同的對象,在對象內部封裝不同的方法(多個)
最后完成的代碼,就是順序地讓?不同的對象調用不同的方法
特點
注重?對象和職責,不同的對象承擔不同的職責
更加適合應對復雜的需求變化,是專門應對復雜項目開發,提供的固定套路
需要在面向過程基礎上,再學習一些面向對象的語法
?
二、類和對象
01. 類和對象的概念
1.1 類
-
類是對一群具有?相同特征或者行為的事物的一個統稱,是抽象的,不能直接使用
- 特征?被稱為?屬性
- 行為?被稱為?方法
- 類就相當于制造飛機時的圖紙,是一個模板,是負責創建對象的
1.2 對象
-
對象是由類創建出來的一個具體存在,可以直接使用
-
由哪一個類創建出來的對象,就擁有在哪一個類中定義的:
- 屬性
- 方法
-
對象就相當于用圖紙制造的飛機
在程序開發中,應該先有類,再有對象
?
02. 類和對象的關系
-
類是模板,對象是根據類這個模板創建出來的,應該先有類,再有對象
-
類?只有一個,而?對象?可以有很多個
-
不同的對象?之間?屬性?可能會各不相同
-
- 類?中定義了什么?屬性和方法,對象?中就有什么屬性和方法,不可能多,也不可能少
?
03. 類的設計
在使用面相對象開發前,應該首先分析需求,確定一下,程序中需要包含哪些類!
在程序開發中,要設計一個類,通常需要滿足一下三個要素:
類名?這類事物的名字,滿足大駝峰命名法
屬性?這類事物具有什么樣的特征
方法?這類事物具有什么樣的行為
大駝峰命名法
每一個單詞的首字母大寫
單詞與單詞之間沒有下劃線
3.1 類名的確定
名詞提煉法分析整個業務流程,出現的名詞,通常就是找到的類
3.2 屬性和方法的確定
-
對?對象的特征描述,通常可以定義成?屬性
-
對象具有的行為(動詞),通常可以定義成?方法
實例:
-
小明?今年?18 歲,身高 1.65,每天早上?跑?完步,會去?吃?東西
-
小強?今年?16 歲,身高 1.60,小強不跑步,小強喜歡?吃?東西
?
三、面相對象基礎語法
01.?dir?內置函數
在Python中對象幾乎是無所不在的,我們之前學習的變量、數據、函數都是對象;
使用內置函數?dir傳入標識符?/?數據,可以查看對象內的所有屬性及方法;
?
提示:?__方法名__?格式的方法是?Python?提供的?內置方法 / 屬性
| 01 | __new__ | 方法 | 創建對象時,會被?自動?調用 |
| 02 | __init__ | 方法 | 對象被初始化時,會被?自動?調用 |
| 03 | __del__ | 方法 | 對象被從內存中銷毀前,會被?自動?調用 |
| 04 | __str__ | 方法 | 返回對象的描述信息,print?函數輸出使用 |
?
02. 定義簡單的類(只包含方法)
?面向對象是更大的封裝,在一個類中封裝多個方法,這樣通過這個類創建出來的對象,就可以直接調用這些方法了!
2.1 定義只包含方法的類
class 類名:def 方法1(self, 參數列表):passdef 方法2(self, 參數列表):pass-
方法的定義格式和之前學習過的函數幾乎一樣
-
區別在于第一個參數必須是self
注意:類名的命名規則 要符合大駝峰命名法
2.2 創建對象
對象變量 = 類名()2.3 第一個面向對象程序
class Dog:"""這是一個狗類"""def eat(self):print("eat....")def run(self):print("run....")dog = Dog()dog.eat()dog.run()引用的概念
在Python中使用類創建對象之后,dog變量中仍然記錄的是對象在內存中的地址
也就是dog變量引用了新建的狗對象
使用print輸出對象變量,默認情況下,是能夠輸出這個變量引用的對象是由哪一個類創建的對象,以及在內存中的地址(十六進制表示)
提示:在計算機中,通常使用十六進制表示內存地址
-
十進制?和?十六進制?都是用來表達數字的,只是表示的方式不一樣
-
十進制?和?十六進制?的數字之間可以來回轉換
-
%d?可以以?10 進制?輸出數字
-
%x?可以以?16 進制?輸出數字
?
03. 方法中的?self?參數
3.1給對象增加屬性
在python中,要給對象設置屬性,非常的容易,但是不推薦使用,因為:對象屬性的封裝應該封裝在類的內部
只需要在類的外部的代碼中直接通過 . 設置一個屬性即可;
dog.name = "薩摩"3.2 使用?self?在方法內部輸出狗的名字
由哪一個對象調用的方法,方法內的 self? 就是哪一個對象的引用。
-
在類封裝的方法內部,self?就表示?當前調用方法的對象自己
-
調用方法時,程序員不需要傳遞?self?參數
-
在方法內部
-
可以通過?self.?訪問對象的屬性
-
也可以通過?self.?調用其他的對象方法
-
-
在?類的外部,通過?變量名.?訪問對象的?屬性和方法
-
在?類封裝的方法中,通過?self.?訪問對象的?屬性和方法
04. 初始化方法
4.1 初始化方法
當使用類名()創建對象時,會?自動?執行以下操作:
這個?初始化方法?就是__init__方法,__init__是對象的內置方法
__init__方法是?專門?用來定義一個類?具有哪些屬性的方法!
4.2 在初始化方法內部定義屬性
-
在__init__方法內部使用?self.屬性名 = 屬性的初始值就可以定義屬性
-
定義屬性之后,再使用Dog類創建的對象,都會擁有該屬性
4.3 改造初始化方法 —— 初始化的同時設置初始值
在開發中,如果希望在創建對象的同時,就設置對象的屬性,可以對 __init__方法進行改造
-
把希望設置的屬性值,定義成__init__方法的參數
-
在方法內部使用?self.屬性 = 形參?接收外部傳遞的參數
-
在創建對象時,使用?類名(屬性1, 屬性2...)?調用
05. 內置方法和屬性
| 01 | __del__ | 方法 | 對象被從內存中銷毀前,會被?自動?調用 |
| 02 | __str__ | 方法 | 返回對象的描述信息,print?函數輸出使用 |
5.1?__del__?方法
-
在python中
- 當使用類名()創建對象時,為對象分配完空間后,自動調用__init__方法
- 當一個對象被從內存中銷毀?前,會自動調用__del__方法
-
應用場景
- __init__改造初始化方法,可以讓創建對象更加靈活
- __del__如果希望在對象被銷毀前,再做一些事情,可以考慮一下 __del__方法
- 生命周期
- 一個對象從調用類名()創建,生命周期開始
- 一個對象的__del__方法一旦被調用,生命周期結束
- 在對象的生命周期內,可以訪問對象屬性,或者讓對象調用方法
- 一個對象從調用類名()創建,生命周期開始
5.2?__str__?方法
-
在python中,使用print輸出對象變量,默認情況下,會輸出這個變量引用的對象是由哪一個類創建的對象,以及在內存中的地址(十六進制表示)
-
如果在開發中,希望使用print輸出對象變量時,能夠打印自定義的內容,就可以利用 __str__這個內置方法了
注意? __str__方法必須返回一個字符串
class Dog:def __init__(self,name):self.name = nameprint("%s 來了" % self.name)def __del__(self):print("%s 去了" % self.name)def __str__(self):return "小狗%s" % self.namesamo = Dog("薩摩")print(samo)?
四、私有屬性和私有方法
01. 應用場景及定義方式
1.1應用場景
-
在實際開發中,對象?的?某些屬性或方法?可能只希望?在對象的內部被使用,而?不希望在外部被訪問到
-
私有屬性?就是?對象?不希望公開的?屬性
-
私有方法?就是?對象?不希望公開的?方法
1.2定義方式
-
在?定義屬性或方法時,在?屬性名或者方法名前?增加?兩個下劃線,定義的就是?私有?屬性或方法
?
02. 偽私有屬性和私有方法
提示:在日常開發中,不要使用這種方式,訪問對象的私有屬性或私有方法
python中,并沒有?真正意義?的?私有
?
- 在給?屬性、方法?命名時,實際是對?名稱?做了一些特殊處理,使得外界無法訪問到
- 處理方式:在?名稱?前面加上 _類名 => _類名__名稱
?
轉載于:https://www.cnblogs.com/ForT/p/10337359.html
總結
- 上一篇: 如何评价模型的好坏(一)
- 下一篇: CodeForces - 1110E-M